【问题标题】:Different response with same scope & path with different auth header with Nock, possible?具有相同范围和路径的不同响应,具有不同的身份验证标头和 Nock,可能吗?
【发布时间】:2018-06-03 11:09:31
【问题描述】:

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

我的项目有一项服务,该服务使用多个用户帐户向该第 3 方 API 进行身份验证。我的一个测试用例是测试该服务,以便/places 被调用两次。该服务向第 3 方 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 运行我的测试。

【问题讨论】:

    标签: mocha.js nock request-promise


    【解决方案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)
    

    【讨论】:

    • 这个回复显然是误导。实际的 API matchHeader(name,value) 匹配在单个范围内创建的任何拦截器上的所有标头。 github.com/nock/nock/blob/…
    • 这不是误导。您可能没有看到它也可以匹配多个标题。 github.com/nock/nock/blob/…
    • 好收获!但是,您必须注意方法调用的顺序,因为它在编写答案时不起作用。
    【解决方案2】:

    使用 Jest,previous answer 将按预期工作,但如果测试失败,输出将完全取决于在被测试的 sn-p 中如何记录请求失败。

    为了使故障更加明确并且测试更易于维护,您可以考虑在对 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-12
      • 2016-10-22
      • 1970-01-01
      • 2019-12-09
      • 2020-01-16
      • 1970-01-01
      • 2023-03-31
      • 2022-10-05
      相关资源
      最近更新 更多