具有相同范围的不同响应&与Nock不同的auth标头的路径,可能吗?

时间:2017-12-20 20:10:38

标签: mocha nock request-promise

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

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

我试图按如下方式模拟第三方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运行我的测试。

2 个答案:

答案 0 :(得分:0)

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

您可以尝试以下操作:

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

答案 1 :(得分:0)

使用笑话previous answer可以按预期工作,但是如果测试失败,则输出将完全取决于在测试的代码段中记录请求失败的方式。

为使故障更明确,并使测试更易于维护,您可以考虑在对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]);
});

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