MochaとNockでモックサーバーを作ってレスポンスのテスト
月に1kgひよこ豆を食べる小飼です。
先日当ブログで岡本がsinon.jsでXHRをキャッチしてモックレスポンスを返す方法について紹介していました。
ちょうど私も別の案件でAPIサーバーへのリクエストのテストを実装したのですが、岡本とは違ったアプローチを採用しました。
本稿ではNode.js
のhttp
モジュールからのリクエストをキャッチしてモックレスポンスを返すnock
をご紹介します。
目的
アプリケーションのフロントエンドとバックエンドのAPIとの通信をテストします。
弊社ではflux
をベースにアプリケーションを構築することが多く、通信部分はActionCreators
レイヤーに関数として実装されています。
そのためXHR/httpモジュール
を切り替えるユニバーサルな通信ライブラリを用いていれば、比較的環境への依存が低いテストが可能になります。
今回はmocha
で走っているテスト環境でnock
を用いた偽レスポンスを設定して通信機能のテストを実装しました。
導入
テストに用いたモジュールは主に3つです。
nock
http
モジュールを用いたリクエストを途中でキャッチして偽のレスポンスを返すモジュール。
mocha
Node.js/ブラウザ共用のテストフレームワーク。mocha.conf.js
のような設定ファイルを必要としないので、手軽にテストが始められます。
power-assert
テスト失敗時の豊富な情報量とシンプルなAPIが魅力のテスト結果検証ライブラリ。
適用
それでは実際にsuperagent
を使ったリクエストをキャッチして偽のレスポンスを返してみます。
まずは各モジュールをインストールします。
※espower-loader/intelli-espower-loader
はpower-assert
の補助的なモジュールだと思ってください。
なぜ必要なのかはこの記事を参照。
npm install --save-dev mocha power-assert espower-loader intelli-espower-loader nock superagent
テスト対象として、適当なAPIを叩いてレスポンスをコールバックに渡す関数を作成します。
話を簡単にするために、認証の不要なgithub
のユーザーAPIを呼ぶことにしました。
APIのドキュメントはこちら
// テスト対象となるファイル dest.js
const request = require('superagent');
const url = 'https://api.github.com/users';
module.exports = (done)=> {
request.get(url).end((err, ret)=> {
if (err) {
return done(err);
}
done(null, ret.body);
});
};
テストファイルはこんな感じです。
// テストファイル
const nock = require('nock');
const assert = require('power-assert');
const dest = require('./dest.js'); //テスト対象のファイル
const url = 'https://api.github.com';
const path = '/users';
describe('偽レスポンスのテスト', ()=> {
// 偽レスポンスの設定
// 一度リクエストされると偽レスポンスの設定は消費されて無くなる
nock(url).get(path).reply(200, {
isMock: true
});
it('偽のレスポンスが返ってくる', (done)=> {
dest((err, response)=> {
assert(err === null); // エラーにならない
assert(response.isMock === true); // 偽のレスポンスが返ってきている
done();
});
});
});
実行
テストを実行してみます。
$(npm bin)/mocha --require intelli-espower-loader
ちゃんと偽のレスポンスが返ってきていて、良い感じです。
まとめ
以上、モックレスポンスライブラリnock
をご紹介しました。
参考にして頂けたらうれしいです。