javascript - 如何将Sinon.js FakeXMLHttpRequest与superagent一起使用?

标签 javascript unit-testing mocking reactjs sinon

我正在尝试测试向服务器发出请求的 React Flux 操作之一。

// AppActions.js
fetchMovies(date) {
    this.dispatch(date);
    request
      .get('/api/movies')
      .query(date)
      .end((err, res) => {
        if (!res.ok) {
          this.actions.fetchMoviesFail(res.body);
        } else {
          this.actions.fetchMoviesSuccess(res.body);
        }
      });
  }

在我的 Flux 商店测试中,我有如下内容:

  // AppStore-test.js
  it ('should successfully handle fetchMovies', () => {
    var callback = sinon.spy();
    var date = {
      startDate: moment('2015-04-01').format('YYYY-MM-DD'),
      endDate: moment('2015-04-15').format('YYYY-MM-DD')
    };

    AppActions.fetchMovies(date, callback);

    requests[0].respond(200, { 'Content-Type': 'application/json' },
      '[{ "id": 12, "comment": "Hey there" }]');

    expect(callback.calledWith([{id: 12, comment: "Hey there"}])).to.be.ok;
  });

这显然行不通,因为 fetchMovies 仅接受一个参数 - date。这是我第一次使用sinon.js ,所以也许我错过了一些非常明显的东西?

我如何伪造这个异步请求并使其成功或失败,因为现在无论我做什么,它都永远不会解决 .end() promise 。

最佳答案

您应该使用nock为此。

Nock 拦截来自您代码的所有 HTTP 请求,然后根据您的设置方式进行响应。 通过这种方式,您可以将模拟和 spy 事件降至最低限度,并将请求视为另一个实现细节。

您创建的 nock 范围会响应某些断言,因此您可以预期它已完成、错误或类似。

一个例子;

var nockScope = nock('http://localhost:8000').get('/api/movies').reply(200, 'OK')

expect(nockScope.isDone()).to.be.ok()

关于javascript - 如何将Sinon.js FakeXMLHttpRequest与superagent一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30653031/

相关文章:

unit-testing - 有趣/写得很好的单元测试阅读(文学编程)

typescript - 使用 Typescript 从 Jest 手动模拟导入函数

javascript - JS 循环遍历数组中的对象

unit-testing - 协调单元测试与 OOD

c# - Visual Studio 单元测试 : why test run inconclusive whereas testing same float values?

unit-testing - 如何模拟 LDAP Laravel 身份验证进行单元测试

c# - 返回传递给方法的值

javascript - 更高效的数组搜索

javascript - ExtJS4 网格 : display objects

javascript - 按条件为 contenteditable div 文本字段中的字母着色