заглушка метода для всех экземпляров класса

1

Пытается 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

1 ответ

1
Лучший ответ

Этот код выглядит более сложным, чем необходимо, особенно для 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

Не забудьте снова восстановить заглушку, так как у вас могут быть странные ошибки в последующих тестах иначе :-)

Раскрытие информации: Я нахожусь в команде Синон.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню