Пытается getSigningKey
метод getSigningKey
из jwksClient. Тем не менее, он фактически выполняет версию non-stub функции и возвращает ошибку вместо 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
})
Этот код выглядит более сложным, чем необходимо, особенно для Sinon. Я предполагаю auth0authorizer.jwksClient
- это опечатка в вашем примере кода, и что вы действительно имели в виду только jwksClient
.
Если вы хотите заглушить экземпляр, вам нужно заглушить созданный экземпляр, а не несуществующий метод на фабричном методе (это то, что вы делаете!).
Это просто означало бы
const client = jwksClient({
cache: true,
jwksUri: jwksUri
});
sinon.stub(client, 'getSigningKey').callsArgWith(1, null, mockResponse)
Но если проблема в том, что у вас нет доступа к сгенерированному объекту клиента по какой-либо причине, например, он создается вне вашего контроля, вам придется jwksClient
прототип jwksClient
. Похоже, вы не можете напрямую импортировать класс JwksClient
, так как lib передается Babel и не экспортирует класс. В этом случае вы можете использовать Object.getPrototypeOf()
.
Просто jwksClient
функцию jwksClient
и 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
Не забудьте снова восстановить заглушку, так как у вас могут быть странные ошибки в последующих тестах иначе :-)
Раскрытие информации: Я нахожусь в команде Синон.