4

我正在使用具有端点的 3rd 方 API,该/places端点返回经过身份验证的用户具有 JSON 权限的位置信息。该 API 使用 JWT 作为身份验证,令牌放在X-Auth-Token标头中。

我的项目有一项服务,该服务使用多个用户帐户向该 3rd 方 API 进行身份验证。我的一个测试用例是测试该服务,以便/places调用两次。该服务向 3rd 方 API 进行身份验证,并X-Auth-Token在请求之前将令牌设置为/places

我试图模拟 3rd 方 API,如下所示:

nock(apiUrl)
  .matchHeaders("x-auth-token", firstToken)
  .get(/places/)
  .reply(200, placeList1);
nock(apiUrl)
  .matchHeaders("x-auth-token", secondToken)
  .get(/places/)
  .reply(200, placeList2)

但是 Nock 向我抛出了请求不匹配的错误。如果我尝试

nock(apiUrl)
  .matchHeaders("x-auth-token", (value) => {
    console.log(value)
    return value === firstToken;
  })
  .get(/places/)
  .reply(200, placeList1);

我可以看到X-Auth-Token其中一个请求的值是正确的,但端点仍然不匹配。

难道我做错了什么?或者甚至有可能对同一范围内的同一路径发出多个请求,并且使用 Nock 做出不同的响应?由于我的服务正在使用 Promises,因此我不能依赖创建请求的顺序。

request-promise-native在我的服务中使用并使用 Mocka 运行我的测试。

4

2 回答 2

1

对于偶然发现这个问题的人,您当然可以使用nock chaining从同一路径获得不同的响应。

您可以尝试以下方法:

nock(apiUrl)
.matchHeaders("x-auth-token", firstToken)
.get(/places/)
.reply(200, placeList1)
.matchHeaders("x-auth-token", secondToken)
.get(/places/)
.reply(200, placeList2)
于 2019-06-26T20:33:11.147 回答
0

使用 Jest之前的答案将按预期工作,但如果测试失败,输出将完全取决于在被测试的代码段中如何记录请求失败。

为了使故障更加明确并且测试更易于维护,您可以考虑在调用中插入一个模拟函数,matchHeader(name, ()=>{})以便可以将这些值作为测试的一部分进行观察。

test('project authenticates multiple accounts', () => {
  const xAuthHeader = jest.fn(s => true);

  const scope = nock(apiUrl)
    .matchHeaders("x-auth-token", xAuthHeader)
    .get('/places/')
    .reply(200, placeList1)
    .get('/places/')
    .reply(200, placeList2);

  await myProject.authenticate()

  expect(xAuthHeader).toHaveNthReturnedWith(1,[firstToken]);
  expect(xAuthHeader).toHaveNthReturnedWith(2,[secondToken]);
});

以这种方式,如果测试失败,jest 框架将在摘要中显式报告不匹配的标头值。

于 2020-11-20T14:15:47.230 回答