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' }