MochaとNockでモックサーバーを作ってレスポンスのテスト

月に1kgひよこ豆を食べる小飼です。
先日当ブログで岡本がsinon.jsでXHRをキャッチしてモックレスポンスを返す方法について紹介していました。
ちょうど私も別の案件でAPIサーバーへのリクエストのテストを実装したのですが、岡本とは違ったアプローチを採用しました。
本稿ではNode.jshttpモジュールからのリクエストをキャッチしてモックレスポンスを返すnockをご紹介します。

nock

目的

アプリケーションのフロントエンドとバックエンドのAPIとの通信をテストします。
弊社ではfluxをベースにアプリケーションを構築することが多く、通信部分はActionCreatorsレイヤーに関数として実装されています。
そのためXHR/httpモジュールを切り替えるユニバーサルな通信ライブラリを用いていれば、比較的環境への依存が低いテストが可能になります。

今回はmochaで走っているテスト環境でnockを用いた偽レスポンスを設定して通信機能のテストを実装しました。

導入

テストに用いたモジュールは主に3つです。

nock

httpモジュールを用いたリクエストを途中でキャッチして偽のレスポンスを返すモジュール。

nock

mocha

Node.js/ブラウザ共用のテストフレームワーク。mocha.conf.jsのような設定ファイルを必要としないので、手軽にテストが始められます。

mocha

power-assert

テスト失敗時の豊富な情報量とシンプルなAPIが魅力のテスト結果検証ライブラリ。

power-assert

適用

それでは実際にsuperagentを使ったリクエストをキャッチして偽のレスポンスを返してみます。

まずは各モジュールをインストールします。
espower-loader/intelli-espower-loaderpower-assertの補助的なモジュールだと思ってください。
なぜ必要なのかはこの記事を参照。

1
npm install --save-dev mocha power-assert espower-loader intelli-espower-loader nock superagent

テスト対象として、適当なAPIを叩いてレスポンスをコールバックに渡す関数を作成します。
話を簡単にするために、認証の不要なgithubのユーザーAPIを呼ぶことにしました。

APIのドキュメントはこちら

1
2
3
4
5
6
7
8
9
10
11
12
// テスト対象となるファイル 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);
});
};

テストファイルはこんな感じです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// テストファイル
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();
});
});
});

実行

テストを実行してみます。

1
$(npm bin)/mocha --require intelli-espower-loader

ちゃんと偽のレスポンスが返ってきていて、良い感じです。

まとめ

以上、モックレスポンスライブラリnockをご紹介しました。
参考にして頂けたらうれしいです。

このエントリーをはてなブックマークに追加