Как смоделировать неасинхронный метод для создания исключения с помощью Jest?

Вот фрагмент моего кода на TypeScript:

let myService: MyService;
let myController: MyController;

beforeAll(async function () {
    myService = new MyService(null);
    myController = new MyController(myService);
});

it("should fail due to any 'MyService' error", () => {
    jest.spyOn(myService, 'create').mockImplementation(() => {
        throw new Error(); // ! the test fails here
    });
    expect(myController.create(data)).toThrowError(Error);
});

Метод create в MyController не является асинхронным, как и в MyService: оба являются обычными методами. Теперь, когда я пытаюсь запустить этот тест, он терпит неудачу в строке фиктивного метода, где выдается исключение: throw new Error(), и он работает правильно, только если я оборачиваю вызов метода create в try/catch следующим образом:

try {
    expect(myController.create(data)).toThrowError(Error);
}
catch { }

Мне это кажется очень странным. Разве это не должно работать без упаковки в try/catch по задумке?


person Sergey    schedule 09.03.2019    source источник


Ответы (1)


Вам просто нужно небольшое изменение.


Из .toThrowError документа:

Используйте .toThrowError для проверки того, что функция вызывается при ее вызове.


Вы передаете результат вызова myController.create(data).

Вам нужно передать функцию, которая срабатывает при вызове, в данном случае:

() => { myController.create(data); }

Измените свою строку expect на это:

expect(() => { myController.create(data); }).toThrowError(Error);  // SUCCESS

... и это должно работать.

person Brian Adams    schedule 10.03.2019
comment
Итак, если мы передаем туда асинхронную функцию, это на самом деле означает, что мы передаем оболочку Promise, которой затем управляет Jest, и поэтому нам больше не нужно оборачивать ее в другую функцию, как в этом случае (с методом синхронизации)? - person Sergey; 10.03.2019
comment
@ Сергей, да, проверка того, что функция async выдает Error, на самом деле просто проверка того, что она возвращает Promise, который отклоняется с Error. Подробнее см. этот ответ. - person Brian Adams; 12.03.2019