0

这是我在 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 不是 async,也不是 of MyService:两者都只是常规方法。现在,当我尝试运行此测试时,它在抛出异常的模拟方法的行上失败:throw new Error()并且只有当我使用这样的create方法调用包装时它才能正常工作:try/catch

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

我觉得这很奇怪。它不应该在没有try/catch设计包装的情况下工作吗?

4

1 回答 1

2

你只需要一点点改变。


.toThrowError文档

用于.toThrowError测试函数在调用时是否抛出。


您正在传递调用的结果 myController.create(data)

您需要传递一个在调用时抛出的函数,在这种情况下:

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

将您的行更改expect为:

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

...它应该工作。

于 2019-03-10T05:45:53.790 回答