Chai断言,无法使用should / expect来识别财产

时间:2017-05-04 15:42:54

标签: mocha chai should.js

您好:需要chai断言的帮助。

我有一个JSON响应,如下所示。我想断言它只包含“姓氏必须”。

我尝试使用此语句,但我得到的错误是AssertionError: expected [ Array(2) ] to have a deep property '#text'。请帮助如何正确地写这个。

使用期望

chai.expect(data.response.error).to.have.deep.property('#text', 'Lastname is mandatory.');

使用

data.response.error.should.have.deep.property('#text', 'Lastname is mandatory.');

响应JSON

{
    response: {
        error: [
            {
            '@id': '1000',
            '#text': 'Firstname is mandatory.'
            },
            {
            '@id': '10001',
            '#text': 'Lastname is mandatory.'
            }
        ],
        result: 
        {
            status: '0'
        }
    }
}

2 个答案:

答案 0 :(得分:5)

在Chai第4版之前

deepproperty的使用要求您将完整路径传递到要测试的媒体资源。换句话说,deep.property不会为您搜索所有属性。正如documentation所说:

  

如果设置了deep标志,则可以使用点和括号表示法对对象和数组进行深层引用。

类似的东西:

data.response.should.have.deep.property("error[0].#text");

或者,如果您使用should的对象是数组,则可以使用数组索引启动属性的路径:

data.response.error.should.have.deep.property("[0].#text");

以下是从您显示的代码派生的完整示例:

const chai = require("chai");
chai.should();

const data = {
    response: {
        error: [
            {
            '@id': '1000',
            '#text': 'Firstname is mandatory.'
            },
            {
            '@id': '10001',
            '#text': 'Lastname is mandatory.'
            }
        ],
        result:
        {
            status: '0'
        }
    }
};

it("works", () => {
    data.response.should.have.deep.property("error[0].#text");
    // Or this, which looks weird but is allowed...
    data.response.error.should.have.deep.property("[0].#text");
});

柴4及以后的版本

OP正在使用早于版本4的Chai版本。如果您使用的是Chai版本4及更高版本,则使用的标志不再是.deep,而是.nested。因此,在版本4或更高版本中使用data.response.should.have.deep.property("error[0].#text");的早期版本中,您将使用data.response.should.have.nested.property("error[0].#text");

答案 1 :(得分:0)

感谢来自github的@shvaikalesh的回复。它有我的问题的相关答案,我提供here以供将来参考+代码提取也在下面以供快速参考。

chai.expect(data.response.error.some(e => e['#text'] == 'Lastname is mandatory.')).to.be.true