У меня проблемы с работой функции Jest toThrowError
.
У меня есть функция, которая использует redis для установки предела для вызова функции, то есть каждый раз, когда эта функция вызывается с помощью клавиши, она вызывает redis.incr(key)
и, если число превышает указанное ограничение, функция с throw LIMITED
error, иначе функция ничего не вернет.
для простоты давайте определим эту функцию следующим образом:
async function fn(key) {
const count = await redis.incr(key)
if(count > limit)
throw new Error('LIMITED')
// do other stuff.
}
Теперь я хочу проверить эту функциональность fn
, поэтому, если limit=2
, я вызываю fn
дважды, и если я вызываю его снова, он должен выдать LIMITED
error.
Вот мой тест:
it('should throw LIMITED error', async () => {
const key = 'somekey'
await fn(key)
await fn(key)
expect(async () => { await fn(key) }).toThrowError('LIMITED')
}
Но когда я запускаю тест, он говорит:
Expected the function to throw an error matching:
"LIMITED"
But it didn't throw anything.
Это странно, потому что когда я меняю код теста на что-то вроде этого:
it('should throw LIMITED error', async () => {
const key = 'somekey'
await fn(key)
await fn(key)
await fn(key)
}
Затем выдает ошибку LIMITED
во время выполнения теста и завершается ошибкой.
Я не уверен, что понимаю, как именно работают функции ожидания ожидания при попытке протестировать поведение функций, поэтому, если есть какой-то лучший способ вытащить этот вид тестирования, я буду признателен за хорошие предложения.
UPDATE:
Я думал, что смогу вызвать fn
три раза внутри функции-обертки, используемой в ожидаемом, вот так:
it('should throw LIMITED error', async () => {
const key = '
expect(async () => {
await fn(key)
await fn(key)
await fn(key)
}).toThrowError('LIMITED')
}
Но даже это не выдает LIMITED
ошибку.
Я даже добавил console.log
внутри fn
, чтобы увидеть, вызывается ли он, но он ничего не печатает, когда я помещаю fn
внутри функции-обертки в expect
.
Так что теперь мне интересно узнать, как это работает при попытке протестировать функции.