我使用具有/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运行我的测试。
答案 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]);
});
以这种方式,如果测试失败,则笑话框架将在摘要中显式报告不匹配的标头值。