1. ホーム
  2. javascript

[解決済み] nock.jsで投稿データを返信させるには?

2022-03-09 21:32:28

質問

この関数が与えられた。

createTrip: function(trip, userId) {
  trip.userId = userId
  trip.id = uuid()
  return axios
    .post(`${url}/trips`, trip)
    .then(res => res.data)
    .catch(error => error)
}

そしてこのテスト。

tripToCreate = {
    "name": "Iceland 2017",
    "start": "2017-04-07",
    "end": "2017-04-29",
    "parts": []
}

describe('#createTrip', function() {
  it('should post the trips to the REST API', async function() {
    nock(baseUrl)
     .post('/trips')
     .reply(201)

    data = await tripDao.createTrip(tripToCreate, 'u1')
    console.log(data)
    expect(data.id).to.match(/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/)
    expect(data.userId).to.equal(tripToCreate.userId)
    expect(data.name).to.equal(tripToCreate.name)
    expect(data.start).to.equal(tripToCreate.start)
    expect(data.end).to.equal(tripToCreate.end)
  })
})

投稿されたデータをnockに返信させたい(そのためjson-serverの動作を模倣している)。 フィールドを2つ追加した後、createTrip()関数によってデータが投稿されるので、単純にハードコードされたデータを返すことはできません。 nock(または他のモッキングツール)を使用して可能でしょうか?

ボーナス質問:このテストを作ることは実際に意味があるのでしょうか?それとも、統合テスト専用のjson-serverを使った真の統合テストの方が良いのでしょうか?

よろしくお願いします。

解決方法は?

はい、nockでサポートされています。ドキュメントのこのセクションを参照してください。 https://github.com/nock/nock#specifying-replies

そこで示された例は、まさにあなたが求めていることを実現しています。

const scope = nock('http://www.google.com')
  .post('/echo')
  .reply(201, (uri, requestBody) => requestBody)

どのようなテストを書けばいいのかについては、どのような動作をテストしようとしているのかを考えることが重要です。nockは(実際のサーバーをセットアップする必要がない)クライアントのテストに最も適していますが ノードモックス-http は、サーバーエンドポイントのテストに適しています (実際のクライアントをセットアップする必要はありません)。