为JavaScript承诺编写测试

时间:2017-02-07 00:45:44

标签: javascript promise

我有这个简单的中间层代码,将由某人调用,它正在调用其他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的建议都值得赞赏。

1 个答案:

答案 0 :(得分:0)

所以从根本上说,你在这段代码中有一个未处理的异常。如果你真的想在拒绝案例中测试行为,那么是的,你需要一个具有.catch处理程序的测试。如果承诺被拒绝,则永远不会调用.then处理程序,因此您的断言不会发生。

你可以做的另一件事是改变这一行:

    someResult.then((result) => {

    return someResult.then((result) => {

这会将承诺返回给Mocha运行器,并让它正确检测失败的测试,其中承诺被意外拒绝。

如果没有它,你的测试中也会出现同步错误 - 摩卡并不知道在报告结果之前等待异步内容完成。返回承诺将您正确地挂钩到测试运行器&结果报告。