如何使 nock.js 回复发布的数据?

how to make nock.js reply posted data?

给出这个函数:

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

我想用发布的数据回复(因此模拟 json-server 的行为)。 由于数据是在添加 2 个字段后由 createTrip() 函数发布的,我不能简单地 return 硬编码数据。 是否可以使用箭尾(或其他 "mocking" 工具)?

加分问题:做这个测试真的有意义吗?或者使用专用 json-服务器进行集成测试的真正集成测试会更好?

在此先感谢您的帮助!

是的,这是诺克支持的。请参阅文档的这一部分: https://github.com/nock/nock#specifying-replies

此处给出的示例完全符合您的要求:

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

虽然至于编写什么样的测试是有意义的,但重要的是要考虑您要测试的行为是什么。 nock 最适合测试客户端(无需设置真实服务器),而其他模拟库(如 node-mocks-http 更适合测试服务器端点(无需设置真实客户端)。