LoginSignup
17
9

More than 5 years have passed since last update.

【Node.js】nockでtest!

Last updated at Posted at 2017-04-21

今回はnockについて紹介しようと思います。

nockとは

nockとは、Node.jsのhttpモジュールからのリクエストをキャッチしてモックレスポンスを返すモジュールです。
nockを使うことで、Node.jsアプリのHTTP通信を含んだコードのテストがしやすくなります。

httpモジュールのみでなく、requestモジュールを使用しているときにも、nockが使用できます。

使い方

インストール

npm install nock

サンプル

以下のモジュールを使い、HTTP通信を行なう関数のテストを実際に書いてみます。

  • nock
  • mocha
  • power-assert

※mocha、power-assertはインストール済みとしてすすめます

以下がテスト対象コードです。

content.js
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を使用してテストすると以下のようになります。

test-content.js
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();

指定したモックレスポンスをすべて解除できます。

他にもヘッダーを設定できたりします。

17
9
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
17
9