按照承诺测试Chai的拒绝

时间:2015-03-31 07:56:41

标签: javascript chai

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

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

我想使用chai-as-promised。

return expect(foo()).to.eventually.be.rejectedWith("my error message");

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

6 个答案:

答案 0 :(得分:38)

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

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

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

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

答案 1 :(得分:31)

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

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

用于声明多个属性

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');
    });

答案 2 :(得分:2)

@Markko Paas的解决方案对我来说不起作用,直到我最终添加',否则被拒绝的值总是{}空对象。

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

答案 3 :(得分:1)

您可以使用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
    });
  });
});

答案 4 :(得分:1)

Chai-As-Promised 对我不起作用,因为如果您期望某些东西被拒绝并且它不会拒绝,它不会抛出。

然后我使用了以下内容,IMO 也很有表现力:

//...
await $radioButton.click();

const executed = await(async () => {
    try {
        await tools.waitUntil(() => {
            return consoleMessages.length === 2;
        }, 1000); // 1000 is the timeout in milliseconds. waitUntil() rejects if it does timeout.
        return true;
    } catch (error) {
        return false;
    }
})();

chai.assert.strictEqual(executed, false);

答案 5 :(得分:0)

就我而言,由于我在 em 函数中使用了 chai-as-promised,所以我所要做的就是在 async 之前添加一个 await 语句。