测试函数中的某些内容是否有未处理的承诺拒绝

时间:2018-03-29 22:37:59

标签: javascript promise mocha tdd

我使用mocha和chai进行测试。

我有一个函数,它接受另一个函数并绕过它,并在调用.call()方法时执行其他一些操作时调用它。

像这样:

let tracker = trackerFactory({
  watchFunction: somefunction
})

tracker.call() //does some things, calls somefunction, does more things...

现在我试图测试它来处理一个函数,当函数返回一个拒绝的承诺时。

it("handles a rejection by the watched function", (done) => {
  let tracker = trackerFactory({
    watchFunction: () => {
      Promise.reject(new Error("random error"))
    }
  })

  expect(function() {
    tracker.call();
  }).to.not.throw("random error");

  done();
})

最终,这个测试应该通过,但我正在做TDD所以我还没有实现处理拒绝的机制。问题是,即使节点显示警告,该测试也会通过:

    ✓ handles a rejection by the watched function
(node:4347) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: random error
(node:4347) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

所以我的问题是,如何测试显示此警告的案例?或者,换句话说,我如何测试函数内部是否存在未处理的拒绝?

2 个答案:

答案 0 :(得分:0)

即使使用TDD,因为您知道测试是针对承诺拒绝的,所以您可以从watchFunction实现承诺拒绝,如下所示:

 return new Promise(function (resolve, reject) {
        if (true)
            resolve();
        else
          // throw new Error("Promise rejected")
            reject();
    }); 

这只是一个尚未实现的承诺的模板,就像throw new MethodNotImplemented例外一样。

在测试中,处理承诺拒绝,就像这样,

it("handles Promise rejection",async ()=>{
    await watchFunction().then(function () {
     console.log("Promise Resolved");
}).catch((error)=>{
    console.log("Promise rejected")
   // assert.equal(error.message,"Promise rejected")
})

答案 1 :(得分:0)

这是我最终做的,我觉得这个解决方案非常舒服:

我使用了chai-as-promised并编辑了我的测试代码:

it("handles a rejection by the watched function", () => {
  let tracker = trackerFactory({
    watchFunction: () => {
      return Promise.reject(new Error("random error"))
    }
  })

  return tracker.call().should.be.fulfilled;
})

如果tracker.call()没有返回Promise,或者它返回了无法解析的promise,则会失败。