Jest запускает функции-оболочки, используемые для проверки с "toThrowError"? - PullRequest
0 голосов
/ 10 января 2019

У меня проблемы с работой функции 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.

Так что теперь мне интересно узнать, как это работает при попытке протестировать функции.

1 Ответ

0 голосов
/ 10 января 2019

toThrowError утверждение запускает предоставленную функцию с try..catch, это единственный способ отловить ошибку в фрагменте кода, который вызывает исключение.

Отклоненные обещания должны быть подтверждены rejects, а не toThrowError, потому что функция async никогда не выдает ошибку. Это синтаксический сахар для обещаний, он возвращает отклоненное обещание в случае возникновения ошибки. throw new Error(...) является аналогом return Promise.reject(new Error(...)) при использовании внутри async.

async () => { 
    await fn(key)
    await fn(key)
    await fn(key)
}

нельзя считать хорошей функцией для тестирования, потому что она свободна и точно не проверяет, какой вызов может вызвать ошибку.

Вероятно, должно быть:

...
await fn(key)
await fn(key)
await expect(fn(key)).rejects.toMatch('LIMITED')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...