【问题标题】:Mock-testing the catch block of a promise method模拟测试 promise 方法的 catch 块
【发布时间】:2021-03-01 16:40:39
【问题描述】:

我的方法是:

getFilterData(filterFields, comparisons, filterValues) {
    return new Promise((resolve) => {
      axios.post('/projects/filter', {
        filter_fields: filterFields,
        comparisons,
        filter_values: filterValues,
      })
        .then((response) => {
          this.setState({
            projectData: response.data,
            isFilterModalOpen: false,
          }, resolve(response));
        })
        .catch(this.handleRequestError);
    });
  }

我试着写一个测试:

describe('When getFilterData() is unsuccessful', () => {
  it('calls handleRequestError', async () => {
      axios.post.mockImplementation(() => Promise.reject(HREResponse));
      const app = await global.shallowWithIntl(<ManageProjectsPage />).dive();
      const spy = jest.spyOn(app.instance(), 'handleRequestError');
      await app.instance().getFilterData(['language'], ['='], ['Java'])
        .catch(error => expect(error).toBe(HREResponse));
      console.log(app.instance().state);
      app.update();
      expect(spy).toHaveBeenCalled();
      spy.mockRestore();
     });
     axios.post.mockReset();
   }); 

错误说,预期的模拟函数已被调用,但没有被调用。 更多详情:

  1. 过滤器被定义为 post 方法。
  2. HREResponse 的状态为 504,即 handleRequestError 接收到的状态。

【问题讨论】:

  • shallowWithIntl 来自哪里?您使用哪个库?

标签: javascript reactjs jestjs axios


【解决方案1】:

当您调用 const spy = jest.spyOn(app.instance(), 'handleRequestError'); 时,它会监视例如 X。

await app.instance().getFilterData(['language'], ['='], ['Java']) .catch(error =&gt; expect(error).toBe(HREResponse)); 在实例 Y 上运行,handleRequestError 不是间谍。

测试时只使用一个应用实例。

describe('When getFilterData() is unsuccessful', () => {
  it('calls handleRequestError', async () => {
    axios.post.mockImplementation(() => Promise.reject(HREResponse));
    const app = await global.shallowWithIntl(<ManageProjectsPage />).dive();
    
    const instance = app.instance(); // create app instance

    const spy = jest.spyOn(instance, 'handleRequestError'); // spy on the instance
    await instance.getFilterData(['language'], ['='], ['Java']) // execute on the instance
      .catch(error => expect(error).toBe(HREResponse));
    console.log(instance.state);
    app.update();
    expect(spy).toHaveBeenCalled();
    spy.mockRestore();
  });
  axios.post.mockReset();
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 2023-03-06
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    相关资源
    最近更新 更多