尝试存根jwksClient的方法getSigningKey
。但是,它实际上执行函数的非存根版本并返回错误而不是mockResponse
。如何将其存根以便它将返回mockResponse
?
const jwksClient = require('jwks-rsa');
sinon.stub(jwksClient(sinon.match.any), 'getSigningKey').callsArgWith(1, null, mockResponse)
const client = auth0authorizer.jwksClient({
cache: true,
cacheMaxEntries: 5, // Default value
cacheMaxAge: ms('10h'), // Default value
jwksUri: jwksUri
});
client.getSigningKey('abc',(err,key) => {
// doesn't stub returns error
})
答案 0 :(得分:1)
这段代码看起来比必要的复杂,特别是Sinon部分。我假设auth0authorizer.jwksClient
在您的示例代码中是一个拼写错误,而您实际上只是jwksClient
。
如果您要存根实例,则需要存根生成的实例,而不是工厂方法上的非现有方法(这就是您正在做的!)。
那只是意味着
const client = jwksClient({
cache: true,
jwksUri: jwksUri
});
sinon.stub(client, 'getSigningKey').callsArgWith(1, null, mockResponse)
但是如果问题是由于某种原因你无法访问生成的客户端对象,例如它是在你的控件之外生成的,你将不得不存根jwksClient
的原型。 It looks like您无法直接导入JwksClient
类,因为lib由Babel编译,并且不会导出类。在这种情况下,您可以使用Object.getPrototypeOf()
。
首先调用jwksClient
函数,然后获取返回的虚拟对象。我们只会用它来修改原型:
const proto = Object.getPrototypeOf( jwksClient(options) );
// create stub on the class method
const stub = sinon.stub(proto, 'getSigningKey').callsArgWith(1, null, mockResponse);
// proceed with test as normal
请记住之后恢复存根,因为在以后的测试中可能会出现奇怪的错误: - )
披露:我在Sinon团队。