我已经在Redux中创建了一个小型学习项目,并基本上从documentation中复制了异步操作的中间件。现在我想为它编写一些测试,以确保在我改变一些东西后它能正常工作。在承诺与Mocha,Chai和Sinon完成后测试不承诺
为了编写我的测试,我使用了摩卡,chai,chai-as-promised和sinon。
我对redux没有任何问题,但我不确定如何测试。
从中间件的相关代码:
export default function callApiMiddleware({ dispatch }) {
return next => action => {
// ... various checks
const [ requestType, successType, errorType ] = types;
dispatch({ ...payload, type: requestType });
return callApi().then(
response => dispatch({ ...payload, type: successType, response }),
error => dispatch({ ...payload, type: errorType, error })
);
}
}
中间件分派适当行动的承诺是否已兑现或拒绝。
为了测试这一点,我和其他人一起剔除了调度函数,并且还传递了一个虚假承诺,即根据我想要测试的结果完成或拒绝。
我写了一个测试是这样的:
it('should trigger success action when successful',() => {
let promise = callApiMiddleware({ dispatch, getState })(next)({
...action,
callApi:() => new Promise((resolve, reject) => resolve('SUCCESS'))
});
return expect(promise).to.eventually.be.fulfilled;
});
这工作正常,但第一个问题我遇到了,当我试图模拟一个拒绝承诺,可能会导致从没有互联网连接,所以我写这个测试:
it('should trigger failure action when failure occurs',() => {
let promise = callApiMiddleware({ dispatch, getState })(next)({
...action,
callApi:() => new Promise((resolve, reject) => reject('ERROR'))
});
return expect(promise).to.eventually.be.rejected;
});
但这种失败,出现以下消息:
AssertionError: expected promise to be rejected but it was fulfilled with undefined
Expected :[undefined]
Actual :[undefined]
这对我来说没有任何意义,因为我明确地传递了一个承诺,即只有功能才会被拒绝。
我的另一个问题是我也想做其他的断言,这些断言并不一定与承诺本身有任何关系,但必须在承诺完成后进行评估。我想断言dispatch
方法被调用两次。在使用sinon的测试中,dispatch
方法本身被删除以执行所需的断言。可能,我想用这种方式做出多个断言。
我曾尝试以下:
it('should trigger success action when successful',() => {
let promise = callApiMiddleware({ dispatch, getState })(next)({
...action,
callApi:() => new Promise((resolve, reject) => resolve('SUCCESS'))
});
return Q.all([
expect(promise).to.eventually.be.fulfilled,
expect(dispatch).to.eventually.be.calledTwice
]);
});
但这返回一些非常大的错误,简单地告诉我,dispatch
不thenable
即不是一个承诺。
我不知道如何做到这一点,所以任何输入将不胜感激。
虽然这不能回答你的问题,你可能会发现[Redux Saga生成器](http://stackoverflow.com/questions/35654334/how-to-test-api-request-failures-with-redux-saga/35674990#35674990)更容易测试。 –
谢谢!我没有听说过,我一定会检查出来,但是我遇到的问题可能不是特定于redux,但更多的是我试图找出的测试工具。 – Pavlin