2016-11-24 29 views
0

我們可以撰寫傳奇在下面的例子中那樣 https://github.com/yelouafi/redux-saga/blob/5a6db57c77141b85b82aa097933ad687aacff8dc/docs/advanced/ComposingSagas.md如何對傳奇組合進行單元測試?

我稱之爲「子傳奇」 loadAssetslibraryChangeCategory

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

回答

2

我找到了解決方案,而不是直接調用生成器,你可以通過redux-saga.call調用子傳奇,即你應該

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