前提・実現したいこと
Node.jsでMocha + ChaiによるWeb APIのテストコードを作成しています。
- Beforeでデータ削除
- BeforeEachで基本データ挿入
- ITケース内で各テストケースに即したデータ挿入
- APIリクエスト実施、アサーション
- AfterEachでデータ削除
のフローで実行しようとしているのですが、
1, 2, 3の各DBアクセスが終わる前にAPIリクエストを実施しているようで、
404や500エラーが発生してしまいます。
上記フロー順に処理が実行されるようにしたいのですが、
どう修正すればよいか分からず、ご教示いただけないでしょうか。
発生している問題・エラーメッセージ
test 1) CASE 0001 - 正常系_200 successを取得すること。 0 passing (163ms) 1 failing 1) test CASE 0001 - 正常系_200 successを取得すること。: AssertionError: expected 404 to equal 200 + expected - actual -404 +200 at Context.<anonymous> (test/sample/detail.js:47:12) at processTicksAndRejections (internal/process/task_queues.js:89:5)
該当のソースコード
テスト実施コード
sample
1'use strict' 2 3import chai from 'chai' 4const assert = chai.assert 5import { readJsonFile } from '../../lib/file_utils' 6import { apiGetRequest } from '../../lib/request_utils' 7import { insertData, destroy, setup } from '../../lib/db' 8 9describe('test', function() { 10 before(async () => { 11 await destroy() 12 }) 13 14 beforeEach(async () => { 15 await setup() 16 }) 17 18 afterEach(async () => { 19 await destroy() 20 }) 21 22 it('CASE 0001 - 正常系_200 successを取得すること。', async () => { 23 // データ挿入 24 await insertData('sample/detail/0001.sql') 25 26 const uri = BASE_URL + 1 27 28 // リクエスト実行 29 const response = await apiGetRequest(uri) 30 assert.strictEqual(response.statusCode, 200) 31 }) 32})
DBアクセスコード
db
1'use strict' 2 3import mysql from 'mysql' 4import { readSqlFile } from './file_utils' 5 6export const setup = async () => { 7 const sql = await readSqlFile('common/user.sql') 8 await execute(sql) 9 10 return Promise.resolve() 11} 12 13export const insertData = async (path) => { 14 const sql = await readSqlFile(path) 15 await execute(sql) 16 17 return Promise.resolve() 18} 19 20export const destroy = async () => { 21 const sql = await readSqlFile('common/truncate_all.sql') 22 await execute(sql) 23 24 return Promise.resolve() 25} 26 27const execute = async (sql) => { 28 const connection = mysql.createConnection({ 29 host: 'localhost', 30 user : 'root', 31 password : 'root', 32 port : 3306, 33 database : 'sample' 34 }); 35 connection.connect() 36 37 return new Promise((resolve, reject) => { 38 try { 39 for (const s of sql) { 40 connection.query(s, (err) => { 41 if (err) reject(err) 42 }) 43 } 44 } finally { 45 connection.end() 46 resolve() 47 } 48 }) 49}
APIリクエスト
request
1'use strict' 2 3import request from 'request' 4 5/** 6 * API Getリクエスト用オブジェクト 7 */ 8export const apiGetRequest = (uri) => { 9 const options = { 10 uri: uri, 11 method: 'GET' 12 } 13 14 return new Promise(function (resolve, reject) { 15 request(options, function (error, res, body) { 16 if (error) { 17 reject(error) 18 } else { 19 resolve(res) 20 } 21 }) 22 }) 23}
試したこと
async/await記法ではなく、
it ('test', (done) => { insertData.then(() => { // APIリクエスト, アサーション }).then(done, done) } before ((done) => { destroy().then(done, done) })
のような書き方に変え、doneを呼ぶようにしてみましたが結果は変わりませんでした。
補足情報(FW/ツールのバージョンなど)
mysql : 5.7.12
Node.js : v12.1.0
package
1{ 2 "name": "sample", 3 "version": "1.0.0", 4 "description": "", 5 "main": "index.js", 6 "scripts": { 7 "test": "./node_modules/.bin/mocha --require babel-core/register ./test/top.js --reporter mochawesome", 8 "lint": "eslint test/* lib/* --fix" 9 }, 10 "author": "", 11 "license": "ISC", 12 "devDependencies": { 13 "@babel/core": "^7.11.1", 14 "@babel/node": "^7.10.5", 15 "@babel/preset-env": "^7.11.0", 16 "babel-cli": "^6.26.0", 17 "babel-preset-env": "^1.7.0", 18 "chai": "^4.2.0", 19 "mocha": "^8.1.1", 20 "request": "^2.88.2" 21 }, 22 "dependencies": { 23 "babel-eslint": "^10.1.0", 24 "eslint": "^7.6.0", 25 "hasky": "^3.0.2", 26 "log4js": "^6.3.0", 27 "mochawesome": "^6.1.1", 28 "mysql": "^2.18.1" 29 } 30}
scripts - testでtop.jsを指定していますが、
今回はテストファイルを個別で指定しているため、実行方法は
./node_modules/.bin/mocha --require babel-core/register ./test/sample.js
となっています。
あなたの回答
tips
プレビュー