javascript - 如何对 sagas 的组合进行单元测试?

标签 javascript unit-testing mocking generator redux-saga

我们可以用那种方式编写传奇 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/

相关文章:

javascript - 如何创建两个相同的数组并仅更改其中一个的值?

c# - 如何模拟返回接口(interface)列表的方法

ruby-on-rails - Rails 5.1 测试更改的属性 弃用警告

python - 在pytest中模拟一个连接类

java - stub() 和 when() 有什么区别?

javascript - 伪造 AJAX-y 登录框

javascript - 当字符少于 3 个时禁用 HTML 按钮

javascript - 在 HTML 中显示可编辑列表(如电子表格)的最简单方法是什么?

visual-studio-2008 - 类型 '<typename>' 的值无法转换为 <typename>

asp.net - 如果可以构建,为什么要模拟 HttpContext?