【问题标题】:How to unit-test composition of sagas?如何对 sagas 的组成进行单元测试?
【发布时间】:2016-11-24 13:11:17
【问题描述】:

我们可以用这种方式编写 sagas https://github.com/yelouafi/redux-saga/blob/5a6db57c77141b85b82aa097933ad687aacff8dc/docs/advanced/ComposingSagas.md

在下一个示例中,我从 libraryChangeCategory 调用“子传奇”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());
}

并且测试两个第一个产量是可以的。

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 生成器。 我只是想嘲笑它。 但是如何?似乎不可能?

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;
});

【问题讨论】:

    标签: javascript unit-testing mocking generator redux-saga


    【解决方案1】:

    我找到了解决方案,你可以通过redux-saga.call调用sub-saga,而不是直接调用generator,即你应该

    yield* loadAssets();

    改成

    yield call(loadAssets);

    比单元测试只是

      import loadAssets from 'sagas/library/loadAssets';
    
      it('should call sub-saga', () => {
        next = generator.next();
    
        expect(next.value).toEqual(call(loadAssets));
      });
    

    【讨论】:

      猜你喜欢
      • 2012-01-08
      • 2019-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      • 1970-01-01
      • 2014-11-16
      相关资源
      最近更新 更多