为什么我的 chai rejectedWith 断言不起作用?

Why doesn't my chai rejectedWith assertion work?

我正在使用 Coffeescript、Mocha 和 chai,我有以下代码:

class Herp extends Error
message = "derpy!"

class Foo
    @bar: ->
        new Promise(() =>
            throw Herp(message)
        )

describe 'Berp', ->
    it 'should herp a derp', ->
        Foo.bar().should.eventually.be.rejectedWith(Herp(message))

我不明白为什么,当我运行这个测试时,它告诉我:

AssertionError: expected promise to be rejected with [Error: derpy!] but it was rejected with [Error: derpy!]

因为该消息看起来非常像是在说它希望它被拒绝,因为它被拒绝的确切内容。我在这里做错了什么?

❯ grep chai package.json         
    "chai": "^3.5.0",
    "chai-as-promised": "^5.3.0",

❯ node --version
v6.4.0

❯ npm --version 
3.10.3

Chai-as-promised 的 rejectedWith() 断言在某种程度上类似于 chai 的 throw()throw() 只是严格的 === 比较。当然,您的错误是两个完全不同的对象,因此并不严格相等。

在这种情况下,我们使用 deep 比较。但是 chai 不支持 deep throws 的相等性,所以我们不能简单地说:

 Foo.bar().should.eventually.be.deep.rejectedWith(Herp(message));

当然 rejected 匹配器是可链接的,所以像下面这样的东西应该可以工作:

Foo.bar().should.eventually.be.rejected.and.deep.equal(Herp(message));

另请参阅:#113 and #1065 了解其他可能的解决方案和问题跟踪。