びぼーろくっ!

誰かに見せるわけでもないけど、備忘録として。。

Mocha + Sinon + Nockを使ったテスト

原因が分かるまで大量に時間を要したので忘れないようにメモっておこう。。

Nockはこの記事を参考にしました。
MochaとNockでモックサーバーを作ってレスポンスのテスト | MMMブログ

ポイントはnockのgetを空文字にしたところ
問題なく通信が行われたこと。
これを指定せずにallusersなどに指定したら
実際に通信が行われてnock化されていない事が判明。。
詳しい原因は調べてみないと分からないけど、とにかく動いた。。

//testファイル
describe('Nockを使ったテスト', () => {
  const exsample = 'http://exsample.com/';
  let stub;
  let target;
  beforeEach('setup', (done) => {
    target = new Target();
    done();
  });
  afterEach('teardown', (done) => {
    stub.restore();
    target = null;
    done();
  });
  //Nockを使ったテスト
  it('use nock', (done) => {
    //メソッドをスタブ化
    stub = sinon.stub(target, 'getBaseUrlByRequest');
    stub.returns(exsample);
    
    //Nockを作成
    var nockRequest= nock(`${exsample}allusers`, {
      reqheaders: {
        'content-type': 'application/json'
      }
    }).get('').reply(200, {
      _id: 'kinachan0725',
      _rev: '946B7D1C',
      username: 'きなちゃん',
      email: 'kinachan0725@exsample.com'
    });
    let result = target.readAllUsers('allusers', null, 'req')
      .then((data) => {
        console.log('data', data);
        assert(data !== undefined);
        done();
      }, (err) => {
        console.log('err', err);
        done();
      });
  });
});
// テスト対象のファイル
export default class Target {
  readAllUsers= async(url, base = null, req = null) => {
    let baseUrl;
    if (base != null) {
      baseUrl = base;
    } else if (req != null) {
      //スタブ化されているので、無条件で全てexsample.comが返却される
      baseUrl = this.getBaseUrlByRequest(req);
    } else {
      baseUrl = typeof window === 'undefined' ? this.BaseUrl : window.location.origin;
    }
    //nockで設定したものが返却される
    const res = await fetch(`${baseUrl}${url}`, {
      method: 'GET',
      credentials: 'same-origin',
      headers: {
        'content-type': 'application/json'
      },
    });
    const json = await res.json();
    return json;
  }
}
//コンソール上の出力結果
data { _id: 'kinachan0725',
  _rev: '946B7D1C',
  username: 'きなちゃん',
  email: 'kinachan0725@exsample.com' }