今回はnockについて紹介しようと思います。
#nockとは
https://github.com/node-nock/nock
nockとは、Node.jsのhttpモジュールからのリクエストをキャッチしてモックレスポンスを返すモジュールです。
nockを使うことで、Node.jsアプリのHTTP通信を含んだコードのテストがしやすくなります。
httpモジュールのみでなく、requestモジュールを使用しているときにも、nockが使用できます。
#使い方
###インストール
npm install nock
###サンプル
以下のモジュールを使い、HTTP通信を行なう関数のテストを実際に書いてみます。
- nock
- mocha
- power-assert
※mocha、power-assertはインストール済みとしてすすめます
以下がテスト対象コードです。
var https = require('https');
var url = "https://qiita.com/api/v2/items";
exports.getData = function (done) {
https.get(url, function (res) {
var body = '';
res.on('data', function (chunk) {
body += chunk;
});
res.on('end', function () {
ret = JSON.parse(body);
done(null, ret);
});
}).on('error', function (e) {
console.log(e.message);
done(e);
});
}
qiitaのAPIにアクセスし、取得した情報をcallback関数(done)に渡します。
エラーが発生したときにはエラーが返ります。
このコードをnockを使用してテストすると以下のようになります。
var nock = require('nock');
var assert = require('power-assert');
var content = require('./content.js');
var url = 'https://qiita.com';
var path = '/api/v2/items';
describe('content.jsのテスト', function () {
it('get response', function (done) {
nock(url).get(path).reply(200, {
'username': 'name'
});
content.getData(function (err, response) {
assert(response.username == 'name');
done();
})
});
});
以下の部分でHTTPS通信のモックレスポンスを定義しています。
nock(url).get(path).reply(200, {
'username': 'name'
});
url
の部分にプロトコルとホストを書きます。
nockはデフォルトではHTTPを想定していますが、HTTPSにも対応しています。HTTPSでアクセスしたい場合は、上記のように'https://'の接頭辞を付けます。
.get
はGETメソッドを使用する、ということを表し、引数としてパスを指定できます。また、第2引数にリクエストのボディを設定できます。
getのほかにもpostやdeleteも使用できます。
.reply
ではレスポンスの内容を定義します。第1引数にはステータスコード、第2引数にはレスポンスのボディを設定できます。
上記の定義によって、https://qiita.com/api/v2/items
のHTTP通信のレスポンスはステータスコード200、{'username': 'name'}
が返ってきます。
以下、その他機能まとめ。
###クエリストリング
nock('http://example.com')
.get('/users')
.query({ name: 'aaa'})
.reply(200);
query
でクエリストリングを設定できます。
###ポートの指定
nock('http://example.com:1100')
...
urlに含めることでポートを指定できます。
###指定した回数、同じレスポンスを返す
nock(url)
.get('/users')
.times(4)
.reply(200);
url/users
へのアクセスのうち、4回目までは200を返します。
5回目からは実際にurl/users
にアクセスした結果が返ります。
###nockのクリーンアップ
nock.cleanAll();
指定したモックレスポンスをすべて解除できます。
他にもヘッダーを設定できたりします。