2017-08-14 33 views
1

我有一个传奇如何使用API​​调用测试传奇?

export function* mysaga(api, action) { 
    const response = yield call(api.service, action); 
    yield put(NavActions.goTo('Page', { success: response.ok })); 
} 

这调用API,并返回值导航到通过API调用的结果(response.ok)另一个屏幕。

it('test',() => { 
    // ... 

    const gen = mysaga(api, action); 
    const step =() => gen.next().value; 

    // doesn't actually run the api 
    const response = call(api.service, {}); 

    expect(step()).toMatchObject(response); // ok 

    // error, Cannot read property 'ok' of undefined 
    expect(step()).toMatchObject(
    put(NavActions.goTo('Page', { success: response.ok })) 
); 
}); 

因为它不是实际运行的API调用response没有得到确定。

我不知道该怎么做才能测试这种情况。

我如何测试我的传奇的第二步?

回答

3

默认情况下,yield表达式解析为它生成的任何内容。但是,您可以将另一个值传递给gen.next方法,然后将yield表达式解析为您在那里传递的内容。

所以这应该做的伎俩(未经测试):

const gen = rootSaga(api, action); 
const step = (val) => gen.next(val).value; 

const mockResponse = { ok: true }; 
const response = call(api.service, {}); 

expect(step(mockResponse)).toMatchObject(response); // ok 

expect(step()).toMatchObject(
    put(NavActions.goTo('Page', { success: true })) 
);