Jest:toThrow()matcher

时间:2018-04-13 11:10:39

标签: reactjs unit-testing promise jestjs throw

上下文:使用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;
      }
    });
}

从日志中我可以看到"我会抛出错误 - >拒绝错误",但测试失败并显示以下消息:

  

期望抛出错误的函数。但它并没有抛出任何东西。

为什么呢?我抛出错误。

卢卡

2 个答案:

答案 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()
  }
})