【问题标题】:What is the purpose of using a mock ajax call in testing?在测试中使用模拟 ajax 调用的目的是什么?
【发布时间】:2016-10-05 08:01:26
【问题描述】:

我正在学习 TDD React here 不明白下面的测试情况:

it('Correctly updates the state after AJAX call in `componentDidMount` was made', (done) => {
  nock('https://api.github.com')
    .get('/users')
    .reply(200, [
      { 'name': 'Reign', 'age': 26 }
    ]);
  // Overwrite, so we can correctly reason about the count number
  // Don't want shared state
  wrapper = mount(<UsersListComponent />);
  setTimeout(function() {
    expect(wrapper.state().usersList).to.be.instanceof(Array);
    expect(wrapper.state().usersList.length).to.equal(1);
    expect(wrapper.state().usersList[0].name).to.equal('Reign');
    expect(wrapper.state().usersList[0].age).to.equal(26);
    nock.cleanAll();
    done();
  }, 1500);
});

使用nock 伪造请求的目的是什么?这个请求没有做任何事情,我不确定响应的去向。我认为TDD方法是编写测试(从包装器开始的代码),看到它失败,然后在实际组件中使用真正的ajax调用进行测试。我不明白 nock 在这里做什么。

【问题讨论】:

    标签: javascript testing reactjs tdd nock


    【解决方案1】:

    在您的代码中调用 nock 的目的是伪造 API 请求。 Nock 捕获/拦截呼叫,而不是实际响应,它返回带有虚假信息的响应。

    测试的标题是Correctly updates the state after AJAX call...,所以目的是测试状态是否正确更新,而不是实际API请求是否成功执行。

    这允许您对不同的场景进行建模和测试,例如,您的应用在接收不同数据集时的行为方式。它还允许您在实际 API 可能尚未准备好时完成测试。

    【讨论】:

      【解决方案2】:

      单元测试的目的是仅以最孤立的方式测试您的代码。伪造 AJAX 请求并获取其响应是一种非常常见的做法,可以避免端点出现问题(因为这不是您要测试的)并专注于处理该端点响应的代码,您可以选择不同的响应模型测试不同的场景。

      当您调用“https://api.github.com/users”时,Nock 只会将响应反馈给您的组件

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-10
        • 1970-01-01
        • 2022-11-27
        • 2020-04-03
        • 1970-01-01
        • 2019-08-16
        • 2017-01-17
        相关资源
        最近更新 更多