首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jest: toThrow() matcher

Jest: toThrow() matcher
EN

Stack Overflow用户
提问于 2018-04-13 11:10:39
回答 2查看 1.9K关注 0票数 0

上下文:使用mobx响应应用程序。

无论如何,我有一个类(一个商店),catalogStore,带有loadProducts方法。此方法调用一个服务来获取数据,然后返回它。

我必须写一个测试,上面写着“如果它不能得到数据,那么抛出一个异常”。

我嘲笑这个函数来获取数据,强迫它拒绝.好的

这是我写的测试

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
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将抛出错误->拒绝错误“,但是测试失败了,这条消息是:

期望函数抛出一个错误。但它没有扔任何东西。

为什么?我要抛出错误。

卢卡

EN

回答 2

Stack Overflow用户

发布于 2018-04-13 18:49:33

您的错误将在承诺链回调上下文中抛出。它将被承诺捕获并传递给下一个捕获处理程序

要修改测试以检查错误,可以使用玩笑的承诺期望

代码语言:javascript
复制
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');
    });
  });
});
票数 2
EN

Stack Overflow用户

发布于 2018-04-13 14:05:18

它的原因是函数返回了一个承诺,所以所有的笑话都是get()函数是被调用的,但是当错误发生在一个承诺中时,测试在抛出错误之前就已经完成了。要测试这个承诺,请看一下异步错误处理是如何工作的。

主要思想是,您有一个异步函数,您可以自己捕获失败的承诺。

代码语言:javascript
复制
it('fails', async()=>{
  try{
    await catalogStore.loadProducts()
  } catch(e) {
    expect(e).toBeDefined()
  }
})
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49815652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档