为什么我的蔡先生不拒绝使用断言工作?

时间:2018-07-18 13:41:01

标签: javascript testing mocha chai

我正在使用Coffeescript,摩卡咖啡和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

1 个答案:

答案 0 :(得分:1)

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

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

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

当然rejected匹配器是可链接的,因此类似以下的内容应该起作用:

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

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