上下文:使用mobx反应应用程序。
无论如何,我是一个类(商店), catalogStore ,带有 loadProducts 方法。此方法调用服务以获取数据,然后将其返回。
我写了一个测试说"如果它无法获取数据,那么抛出异常"
我模拟了应该获取数据的函数,强制它拒绝...确定
这是我写的测试
describe("catalogStore", () => {
describe("if the catalog fails to get the data", () => {
beforeAll(() => {
catalogService.get = jest.fn().mockImplementation(() => {
return new Promise((resolve, reject) => {
reject("rejected error");
});
});
});
it("should throw an error", () => {
return expect(() => catalogStore.loadProducts()).toThrow();
});
});
});
这是loadProducts函数:
loadProducts() {
return catalogService
.get()
.then(result => {
this.products = result.services;
return {products: this.products};
})
.catch(error => {
console.log("CatalogStore loadProducts error catch: ", error);
return { error };
})
.then(({ error }) => {
if (error) {
console.log("Im gonna throw the error -> ", error);
throw error;
}
});
}
从日志中我可以看到"我会抛出错误 - >拒绝错误",但测试失败并显示以下消息:
期望抛出错误的函数。但它并没有抛出任何东西。
为什么呢?我抛出错误。
卢卡
答案 0 :(得分:2)
您的错误会在Promise链回调的上下文中抛出。它将被Promise捕获并传递给下一个catch handler。
要修改测试以检查错误,可以使用Jest's Promise expectations:
describe("catalogStore", () => {
describe("if the catalog fails to get the data", () => {
beforeAll(() => {
catalogService.get = jest.fn().mockImplementation(() => {
return new Promise((resolve, reject) => {
reject("rejected error");
});
});
});
it("should throw an error", () => {
return expect(catalogStore.loadProducts()).rejects.toThrow('rejected error');
});
});
});
答案 1 :(得分:-1)
它导致函数返回一个promise,所以所有jest都看到get()
函数被调用但是在一个promise中发生错误,测试在抛出错误之前就完成了。为了测试这些承诺是如何看待async error handling的作用。
主要的想法是你有一个异步功能,你可以自己捕捉失败的承诺
it('fails', async()=>{
try{
await catalogStore.loadProducts()
} catch(e) {
expect(e).toBeDefined()
}
})