我正在创建React应用程序并使用react-boilerplate作为我的基础项目。在了解了Redux,Sagas和reselect并让我的第一个组件运行后,我想编写相应的单元测试。但遗憾的是,我无法使用相应的选择器对select语句进行测试以正确测试:
const selectDomain = () => (state) => state.get('myDomain');
const selectDomainMessage = () => createSelector(selectDomain(), (domain) => domain.get('message'));
function* send() {
const message = yield select(selectDomainMessage());
...
yield put(sentAction(message);
}
describe('send Saga', () => {
const generator = send();
it('should return select descriptor', () => {
let expectedDescriptor = select(selectDomainMessage());
let returnedDescriptor = generator.next().value;
expect(returnedDescriptor).toEqual(expectedDescriptor);
});
});
从我的角度来看,这个测试应该可行,但它失败了(不是真正有帮助的)错误消息:
预期对象({@@ redux-saga / IO:true,SELECT:Object({selector:Function,args:[]})})等于Object({@@ redux-saga / IO:true,SELECT :Object({selector:Function,args:[]})})。
为了更轻松地重现问题,我创建了一个具有所需环境的JSFiddle。也许有人可以告诉我我做错了什么。
答案 0 :(得分:1)
您的测试失败,因为预期和实际情况下的选择器功能不是等效的。
函数selectDomainMessage
返回createSelector
返回的函数;每次createSelector
运行时,它都会返回一个新函数。
为了让您的测试通过,您可以将createSelector
的返回函数捕获为变量并让selectDomainMessage
返回:
const selector = createSelector(selectDomain(), (domain) => domain.get('message'))
const selectDomainMessage = () => selector;
修改后的JSFiddle