Promise な関数を mocha でテストする
Promise 使った関数のテスト書こうとしてハマったのでメモ。
普通にdone
を使って実装したところ、アサーションに失敗した場合に、タイムアウトエラーになってしまう。
「expect は hoge なんだけど実際は fuga だったよ」って言ってほしいのにタイムアウトエラーになる。
おかしい!
// ダメな例 it('ユーザIDを指定してユーザ情報を取得できること', (done) => { User.findOne({id: 'test_uuid'}).then((data) => { expect(data.email).to.equal('hoge@example.com'); done(); }, (err) => { done(err); }); });
実は、mocha は正式に Promise をサポートしていて、公式ページにも記載がある。
mocha の"Working with Promises" の章
以下のように書くことで Promise を使用した関数にアサーションかけることができる。
ぷるり を読むと、わざわざエラーの場合のコードは書かなくてよいらしい。
it('ユーザIDを指定してユーザ情報を取得できること', () => { return User.findOne({id: 'test_uuid'}).then((data) => { expect(data.email).to.equal('hoge@example.com'); }); });
これで Promise なライブラリを気持ちよくテストできてしあわせ。