如何使用Redux Saga测试API请求失败?

我正在尝试测试我的传奇故事可能发生的每一个场景,但我无法做出我想要的行为。
这很简单,我有一个HTTP请求(登录),我想通过模拟我的API方法来测试成功和失败案例

但是,调用效果似乎没有触发我的api函数,我还不知道它是如何工作的,但我想中间件负责调用函数,因为我没有在测试中查看存储,所以我无法得到结果

所以我的问题是,当您需要在异步调用旁边分派不同的操作(通常是成功或失败)时,如何测试您的传奇

我寻找了一个例子,我发现了成功和失败的传奇故事,但失败案例从未被测试过,例如在这里的购物车示例中

SAGA.JS

导出功能*登录(操作){
试一试{
const user=yield调用(api.login,action);
返回收益put(actions.loginsAccess(用户));
}捕获(e){
让与卖出(actions.loginFail(e));
}
}
导出默认函数*rootAuthenticationSagas(){
收益率*takeLatest(登录,登录);
}

TEST.JS

描述('login',()=&gt{
上下文('当它失败时',()=&gt{
在('Stub the api',()=&gt{
sinon.stub(api,‘登录’,()=&gt{
//它从不来这里!
return Promise.reject({error:'user not found'});
});
});
它('应返回登录失败操作',()=&gt{
常量动作={
有效载荷:{
名称:“toto”,
密码:“123456”
}
};
const生成器=登录(操作);
//买入收益率
generator.next();
const expectedResult=put({type:'LOGIN_FAIL',负载:{error:'user not found'}});
expect(generator.next().value).to.be.eql(expectedResult);//失败,因为我获得了登录成功而不是失败
});
});
});

马克的回答是正确的。中间件执行这些指令。但这会使您的生活更轻松:在测试中,您可以提供任何您想要的作为next()的参数,并且生成器函数将作为yield的结果接收它。这正是saga中间件所做的(除了它实际上激发了一个请求,而不是给你一个虚假的响应)

要使yield获得任意值,请将其传递给next()。要使其“接收”错误,请将其传递给throw()。在您的示例中:

它('应该返回登录失败操作',()=&gt{
常量动作={
有效载荷:{
名称:“toto”,
密码:“123456”
}
};
const生成器=登录(操作);
//检查Saga是否要求调用API
期待(
generator.next()值
).to.be.eql(
调用(api.login、操作)
);
//请注意,*未提出任何实际请求*!
//我们只是检查效果的顺序是否符合我们的预期。
//检查Saga对故障的反应是否正确
期待(
发电机抛距({
错误:“找不到用户”
}).价值
).to.be.eql(
放({
键入:“登录\失败”,
有效负载:{错误:'未找到用户'}
})
);
});

发表评论