Как смоделировать не асинхронный метод для выдачи исключения с помощью Jest? - PullRequest
0 голосов
/ 09 марта 2019

Вот фрагмент из моего кода в 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 по замыслу?

1 Ответ

1 голос
/ 10 марта 2019

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


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

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


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

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

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

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

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

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

...