上下文:使用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;
}
});
}从日志中我可以看到"Im将抛出错误->拒绝错误“,但是测试失败了,这条消息是:
期望函数抛出一个错误。但它没有扔任何东西。
为什么?我要抛出错误。
卢卡
发布于 2018-04-13 18:49:33
您的错误将在承诺链回调上下文中抛出。它将被承诺捕获并传递给下一个捕获处理程序。
要修改测试以检查错误,可以使用玩笑的承诺期望
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');
});
});
});发布于 2018-04-13 14:05:18
它的原因是函数返回了一个承诺,所以所有的笑话都是get()函数是被调用的,但是当错误发生在一个承诺中时,测试在抛出错误之前就已经完成了。要测试这个承诺,请看一下异步错误处理是如何工作的。
主要思想是,您有一个异步函数,您可以自己捕获失败的承诺。
it('fails', async()=>{
try{
await catalogStore.loadProducts()
} catch(e) {
expect(e).toBeDefined()
}
})https://stackoverflow.com/questions/49815652
复制相似问题