如何在捕获 Promise 时使 Node 单元测试失败?

How do I fail a Node unit test on the catch of a Promise?

我正在使用 Node.js 进行一些单元测试,我想通过这样的测试:

doSomething()
    .then(...)
    .catch(ex => {
        // I want to make sure the test fails here
    });

我正在使用 Assert,所以我发现 Assert.Fails. The problem is that fails expects actual and expected, which I don't have. The Node documentation doesn't say anything about them being required, but the Chai documentation,它是 Node 兼容的,说它们是。

我应该如何未能通过承诺的 catch 测试?

你考虑过Assert.Ok(false, message)吗​​?它更简洁。

Assert.fail 正在寻求进行比较并显示其他信息。

您可以使用专用的间谍库,例如 Sinon,或者您可以自己实现一个简单的间谍。

function Spy(f) {
  const self = function() {
    self.called = true;
  };
  self.called = false;
  return self;
}

间谍只是一个包装函数,它记录有关如何调用该函数的数据。

const catchHandler = ex => ...;
const catchSpy = Spy(catchHandler);

doSomething()
  .then(...)
  .catch(catchSpy)
  .finally(() => {
    assert.ok(catchSpy.called === false);
  });

基本原则是监视 catch 回调,然后使用您的 promise 的 finally clause 确保未调用监视程序。

如果你将使用mocha,那么优雅的方式如下:

describe('Test', () => {
  it('first', (done) => {
    doSomething()
    .then(...)
    .catch(done) 
    })
})

如果您的 Promise 失败,done 方法将以抛出的异常作为参数被调用,所以上面的代码等同于

catch(ex => done(ex))

mocha 中,使用参数调用 done() 未通过测试。