我正在尝试测试向服务器发出请求的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()
承诺。
答案 0 :(得分:1)
您应该使用nock。
Nock拦截来自您代码的所有HTTP请求,然后根据您的设置进行响应。 通过这种方式,您可以将您的模拟和间谍降至最低,并将请求视为另一个实现细节。
您创建的nock作用域会响应某些断言,因此您可以预期它已完成,有缺陷或类似。
一个例子;
var nockScope = nock('http://localhost:8000').get('/api/movies').reply(200, 'OK')
expect(nockScope.isDone()).to.be.ok()