按照承诺测试Chai的拒绝

Gui*_*uid 33 javascript chai

我想测试一个返回promise的函数.

在这个特定的测试中,预期承诺将被拒绝,其中包含经典message字段的Error对象(在此测试中,它应该相等"my error message")和我添加的自定义字段named code,这是一个字符串(如"EACCESS"," ERIGHT"等,在这个测试中它预计会相等"EFOO")

我想使用chai-as-promised.

return expect(foo()).to.eventually.be.rejectedWith("my error message");
Run Code Online (Sandbox Code Playgroud)

这个断言正在起作用,但现在我也想测试这个code领域.
怎么做?

Kei*_*mus 45

如果您正在使用Chai-As-Promised(正如您所说的那样),那么它允许链接rejectedWith- 并且它将链断言对象设置为错误对象 - 意味着rejectedWith()现在将在Error上断言的任何内容.这可以让你做一些很酷的事情:

return expect(foo()).to.eventually
  .be.rejectedWith("my error message")
  .and.be.an.instanceOf(Error)
  .and.have.property('code', 'EFOO');
Run Code Online (Sandbox Code Playgroud)

一些chai方法也链,所以你可以用它来做一些关于错误的非常深层嵌套的断言:

return expect(foo()).to.eventually
  .be.rejectedWith("my error message")
  .and.have.property('stack')
    .that.includes('myfile.js:30')
Run Code Online (Sandbox Code Playgroud)

  • 由于某种原因,这对我不起作用.无论我做什么错误消息字符串它总是通过. (8认同)
  • @chovy你需要返回expect函数,否则它将无法工作。过去 30 分钟我一直在敲头,直到我发现我忘了回来,现在它对我有用了。 (6认同)
  • @ChristianSaiki 非常感谢!在过去的 20 分钟里,我一直在为同样的问题而头撞墙。 (2认同)

小智 31

拥有ChaiAsPromised的5.1.0版本,来自Keithamus的解决方案对我不起作用 - 被拒绝但没有给我断言的错误对象,但是"拒绝"做了:

return expect(foo())
    .to.be.rejected
    .and.be.an.instanceOf(Error)
    .and.have.property('code', 'EFOO');
Run Code Online (Sandbox Code Playgroud)

用于声明多个属性

return expect(foo())
    .to.be.rejected
    .then(function(error) {
        expect(error).to.have.property('name', 'my error message');
        expect(error).to.have.property('code', 'EFOO');
    });
Run Code Online (Sandbox Code Playgroud)


小智 10

@Markko Paas 的解决方案在我添加“最终”之前对我不起作用,否则拒绝的值总是 {} 空对象。

return expect(foo())
    .to.eventually.be.rejected
    .and.be.an.instanceOf(Error)
    .and.have.property('code', 'EFOO');
Run Code Online (Sandbox Code Playgroud)


Ami*_*ein 8

chai-as-promised就我而言,由于我在函数中使用async,所以我所要做的就是await在 之前添加一条语句expect(promise).to.be.rejectedWith(errorMessage),例如:

it('should reject', async () => {
    await expect(promise).to.be.rejectedWith(errorMessage);
//  ^^^^^
});
Run Code Online (Sandbox Code Playgroud)


Ric*_*aca 5

您可以使用rejected.then以下方法对错误执行复杂的测试:

it('throws a complex error', function () {
  return expect(foo()).to.eventually.be.rejected.then((error) => {
    expect(error.code).to.equal('expected code');
    // other tests
    // alternatively,
    expect (error).to.eql({
      foo: 'foo',
      bar: 'bar
    });
  });
});
Run Code Online (Sandbox Code Playgroud)