为一个类的所有实例存根方法

时间:2017-06-08 14:44:58

标签: javascript node.js sinon

尝试存根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
})

1 个答案:

答案 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团队。