如何使用Sinon.js FakeXMLHttpRequest与superagent?

时间:2015-06-04 19:59:07

标签: 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()承诺。

1 个答案:

答案 0 :(得分:1)

您应该使用nock

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

您创建的nock作用域会响应某些断言,因此您可以预期它已完成,有缺陷或类似。

一个例子;

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

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