我有这个简单的中间层代码,将由某人调用,它正在调用其他api,它返回Promise
function getSomething() {
return api.fetchSomething()
.then(response => response)
}
为了测试这个,我写了这个传递的测试。
it('should make a call to api method ', () => {
const someResponse = {};
const fetchSomethingStub = sandbox.stub(api, 'fetchSomething').returns(Promise.resolve(someResponse));
const someResult = getSomething();
someResult.then((result) => {
expect(fetchSomethingStub ).to.have.callCount(1);
expect(result).to.eventually.equal(someResponse);
});
});
但是由于我的api.fetchSomething()
也可以返回拒绝,我更改了存根以返回Promise.reject
但是测试正在传递但是有消息(node:14688) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): [object Object]
。这是否意味着我必须在此图层中catch
阻止。我打算从api传递价值。我也正在做正确的测试。任何有资源寻找使用摩卡测试Promise的建议都值得赞赏。
答案 0 :(得分:0)
所以从根本上说,你在这段代码中有一个未处理的异常。如果你真的想在拒绝案例中测试行为,那么是的,你需要一个具有.catch
处理程序的测试。如果承诺被拒绝,则永远不会调用.then
处理程序,因此您的断言不会发生。
你可以做的另一件事是改变这一行:
someResult.then((result) => {
到
return someResult.then((result) => {
这会将承诺返回给Mocha运行器,并让它正确检测失败的测试,其中承诺被意外拒绝。
如果没有它,你的测试中也会出现同步错误 - 摩卡并不知道在报告结果之前等待异步内容完成。返回承诺将您正确地挂钩到测试运行器&结果报告。