为 class 的所有实例存根方法

stubbing a method for all instances of a class

正在尝试对 jwksClient 的方法 getSigningKey 进行存根。但是,它实际上执行了函数的非存根版本并且 return 是一个错误而不是 mockResponse。如何存根使其 return 而不是 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
})

这段代码看起来比必要的更复杂,尤其是 Sinon 部分。我假设 auth0authorizer.jwksClient 是您的示例代码中的错字,而您的意思只是 jwksClient

如果你想存根实例,你需要存根生成的实例,而不是工厂方法上不存在的方法(你正在做的!)。

那只是意味着

const client = jwksClient({
     cache: true,
     jwksUri: jwksUri
});
sinon.stub(client, 'getSigningKey').callsArgWith(1, null, mockResponse)

但是如果问题是由于某种原因您无法访问生成的客户端对象,例如它是在您的控制之外生成的,您将不得不存根 jwksClient 的原型。 It looks like 您不能直接导入 JwksClient class,因为 lib 是由 Babel 转译的,不会导出 class。在这种情况下,您可以使用 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

请记住事后恢复存根,否则在以后的测试中可能会出现奇怪的错误:-)

Discloser:我在Sinon团队。