express + knex の構築は書かず、 mocha + chai の記事になります。
導入
npm もしくは yarn でインストールすれば即実行できる。
npm i -D mocha chai supertest
const request = require("supertest")(require("../../app"))
const expect = require("chai").expect
const assert = require("chai").assert
const security = require("../security")
describe("Authorization", () => {
it("should return 200", async () => {
return request
.put(`/auth_test`)
.set(
"Authorization",
await security.generateJWT()
)
.expect(200)
})
})
よかったところ
柔軟な仕様
API でも Repository でも直接叩くこともできるので導入が早く、簡潔に検証を行える。
テストを書く負担が軽い
expect(customer).to.be.a("object")
expect(customer.id).to.be.equal(1)
英文に近くてすぐに理解できる文法なので、テストフレームワークで消耗しなくて済む。
心理的負担の軽減
お恥ずかしながら、包括的にテストを書いたのは今回が初めてなので mocha + chai についてというよりもテストフレームワークについて。
テストがあることによって心理的負担がかなり減った。
テストによって動作を定義しながら構築していけるのはつよい。
describe
をネストすることでテストを構造化できる
API を使用するケース分けしてテストすることができるので思考の整理にもつながった。
1つのテストの中で複数の検証するのではなく、1つのテストで1つの検証という風に作るほうがテスト結果を見やすくていいのではと思っている。
Customer
POST /customer/register
first registration
✓ should return 200 (2629ms)
✓ should register customer (1113ms)
✓ should register customer name (1113ms)
✓ should register customer email (1113ms)
✓ should add customer to group (1113ms)
duplicate registration
✓ should return 400 (2629ms)
✓ should not register (1113ms)
つまづいたところ
ここからは、つまづいたところを書いていく。
基本的なところが多いと思います。
API がタイムアウトする問題
解決:mocha のタイムアウト設定を変更する
mocha --timeout 9000
前のテストのデータ変更が残る問題
解決:テスト実行前に毎回 knex seed:run
を実行する
指定するファイルパスは package.json
がある地点からです。
beforeEach(async () => {
await knex.seed.run({directory: "./seeds/test"})
})
オートインクリメントがリセットされない問題
解決: seed ファイルでオートインクリメントをリセットする
await knex.raw('ALTER TABLE customers AUTO_INCREMENT = 1');
await knex('customers').insert([
{
name: "test"
}
])