我们可以用那种方式编写传奇 https://github.com/yelouafi/redux-saga/blob/5a6db57c77141b85b82aa097933ad687aacff8dc/docs/advanced/ComposingSagas.md
在下一个示例中,我从 libraryChangeCategory
调用“sub-saga”loadAssets
import * as LibraryActions from 'actions/libraryActions';
import loadAssets from './loadAssets';
export default function* libraryChangeCategory(category) {
yield put(LibraryActions.librarySetCategory(category));
yield put(LibraryActions.librarySetLoading());
yield* loadAssets();
yield put(LibraryActions.libraryResetLoading());
}
并且测试两个第一次yield是OK的。
import libraryChangeCategory from 'sagas/library/changeCategory';
const generator = libraryChangeCategory(LibraryCategories.Backgrounds);
let next;
it('should set category', () => {
next = generator.next();
expect(next.value).toEqual(
put(LibraryActions.librarySetCategory( LibraryCategories.Backgrounds )));
});
但我不想在这里测试 loadAssets
生成器。
我只是想 mock 它。
但是怎么办?好像不太可能?
function* mockGen() {
yield;
}
let loadAssets = libraryChangeCategory.__get__('loadAssets');
// don't work
loadAssets.__Rewire__(loadAssets.__get__('loadAssets'), mockGen);
// don't work too
spyOn(loadAssets, 'loadAssets').and.callFake(function(st) {
yield;
});
最佳答案
我找到了解决方案,而不是直接调用生成器,你可以通过 redux-saga.call
调用 sub-saga,即你应该
yield* loadAssets();
改为
yield 调用(loadAssets);
然后单元测试将只是
import loadAssets from 'sagas/library/loadAssets';
it('should call sub-saga', () => {
next = generator.next();
expect(next.value).toEqual(call(loadAssets));
});
关于javascript - 如何对 sagas 的组合进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40787317/