LoginSignup
1
3

More than 5 years have passed since last update.

express + knex で作った API のテストを mocha + chai で書いた

Posted at

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"
        }
    ])
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3