Ожидайте, что функция выдаст исключение в Jest - PullRequest
3 голосов
/ 15 января 2020

У меня есть функция (hostelService.book), которая возвращает обещание: return Promise.resolve(response);, и я сделал этот тест:

const action = async () => {
        await hostelService.book(id);
    };


  await expect(action).rejects.toThrow();

, но у меня есть эта ошибка:

 Matcher error: received value must be a promise

Ответы [ 6 ]

1 голос
/ 17 января 2020

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

Попробуйте это решение

const action = async () => {
  await hostelService.book(id);
};
expect(action()).rejects.toThrow();
0 голосов
/ 21 января 2020

Jest выдает эту ошибку Matcher error: received value must be a promise, потому что в expect вы просто передаете ссылку на функцию. Без () - action это просто ссылка на функцию, она ничего не будет возвращать.

Чтобы исправить эту проблему, вы должны вызывать функцию в ожидаемом порядке, например action(), чтобы она возвращала объект обещания.

И вторая часть, вы должны выбросить ошибку, как. Promise.reject(new Error('some error')); в отклонении, поэтому условие tothrow может быть полностью заполнено.

Пример:

function hostelService() {
   return Promise.reject(new Error('some error'));
}

const action = async () => {
   await hostelService();
};

it( "Should throw the error", async () => {
   await expect(action()).rejects.toThrow('some error');
});

Надеюсь, это будет полезно.

0 голосов
/ 20 января 2020

Кажется, у тебя это почти есть. Я создал CodeSandbox с функцией, которая выдает ошибку и тест, который проходит. Вы можете запустить его с npm run test в терминале внутри codeandbox. Вот ссылка:

https://codesandbox.io/s/musing-goodall-ssss4?fontsize=14&hidenavigation=1&theme=dark

Но в основном код такой:

const action = async () => {
  throw new Error("error!")
}

describe("func", () => {
  it("should fail", async () => {
    await expect(action()).rejects.toThrow()
  })
})

Разница с кодом, который вы показали, заключается в позвоните по номеру action(), который отсутствовал, возможно, это была ошибка типа. Я не знаю, было ли это ошибкой или это был не просто код, и вы просто хотели объяснить, что вы хотели. В будущем, для лучшего понимания и для помощи вашим будущим «помощникам», вы должны опубликовать фрагмент своего кода (или изменить его, чтобы избежать проблем со свойством).

0 голосов
/ 17 января 2020

Ваш тест не пройден, потому что вы ожидаете обещание (и, следовательно, он больше не является обещанием, когда вы звоните по нему .rejects). Если вы удалите await из последнего оператора, это должно сработать:

const action = async () => {
  await hostelService.book(id);
};

expect(action()).rejects.toThrow();

Вот некоторые обоснования этого. async автоматически переводит ваш тип возврата в Обещание. Однако, когда вы вызываете await, он синхронно «разворачивает» значение данного обещания и поэтому не может вызвать .rejects для результата (если вы не заключите обещание в другое обещание).

Я составил небольшой пример , чтобы проиллюстрировать, что я имею в виду.

0 голосов
/ 17 января 2020

К сожалению, вы не можете проверить отклонения напрямую с помощью toThrow(). Отклонение само по себе является объектом ошибки, поэтому вы можете проверить на равенство.

test('', () => {
  // dont forget to call the action. 
  await expect(action()).rejects.toEqual(new Error())
});

Вы можете найти другие обходные пути здесь https://github.com/facebook/jest/issues/1700

0 голосов
/ 17 января 2020

Вы можете использовать try/catch,

it("should throw an error", async () => {
    try {
        await hostelService.book(id);

        throw new Error();
    } catch (error) {
        expect(error).toHaveProperty("message", "something bad happend! :/")
    }
})

Дополнительный throw new Error() после hostelService вызова предназначен для того, чтобы гарантировать, что бросает блок try и логика c в hostelService выбрасывает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...