質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Mocha

Mochaは、JavaScriptのテストフレームワークの一つ。mocha自体にはアサーション機能はなく、ブラウザを使用するフロントエンドのテストや、node.jsを用いたテストの両方に対応しています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Q&A

0回答

805閲覧

Mocha + ChaiのテストコードでDBアクセスの順番が入れ替わってしまう

gk0412

総合スコア0

Mocha

Mochaは、JavaScriptのテストフレームワークの一つ。mocha自体にはアサーション機能はなく、ブラウザを使用するフロントエンドのテストや、node.jsを用いたテストの両方に対応しています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

0グッド

0クリップ

投稿2020/08/24 11:25

編集2020/08/26 05:20

前提・実現したいこと

Node.jsでMocha + ChaiによるWeb APIのテストコードを作成しています。

  1. Beforeでデータ削除
  2. BeforeEachで基本データ挿入
  3. ITケース内で各テストケースに即したデータ挿入
  4. APIリクエスト実施、アサーション
  5. 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

となっています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問