Should.js 在单个 属性 上链接多个断言

Should.js chaining multiple assertions on a single property

我有一个这样的对象:

var obj = {
    "uuid": "60afc3fa-920d-11e5-bd17-b9db323e7d51",
    "type": "candy"
}

我想编写一个测试,首先检查对象是否首先具有 属性 'uuid',然后 'uuid' 是特定长度(36 个字符) .

尝试这行不通

obj.should.have.property('uuid').which.should.have.length(36)

它失败了:

Uncaught AssertionError: expected Assertion {
  obj: '60afc3fa-920d-11e5-bd17-b9db323e7d51',
  params: { operator: 'to have property \'uuid\'' },
  negate: false } to have property 'length' of 36 (got [Function])

还有这个(这实际上在语法上没有任何意义——因为它适用于父对象而不是值)

obj.should.have.property('uuid').and.be.length(36)

失败:

Uncaught TypeError: usergridResponse.entity.should.have.property(...).which.should.be.equal.to is not a function

即使这样也行不通:

obj.should.have.property('uuid').which.equals('60afc3fa-920d-11e5-bd17-b9db323e7d51')

那么在对象的 属性 上链接断言的正确方法是什么?

第一个语句失败,因为你调用了 .should 两次 - 第二次你断言断言,它应该是:

obj.should.have.property('uuid').which.have.length(36)

(错误消息字面意思是,Assertion {...} 没有 属性 长度)

第二条语句没有为我抛出:

obj.should.have.property('uuid').and.be.length(36)

(你的错误信息看起来不是你断言失败)

最后一个声明 - 没有 .equals 断言 - 应该是 .equal。这对我来说是有原因的,因为 "0320a79a-920d-11e5-9b7a-057d4ca344ba" !== "60afc3fa-920d-11e5-bd17-b9db323e7d51"

希望对您有所帮助。

我认为这可能是更好的选择:

var session = {
    "uuid": "60afc3fa-920d-11e5-bd17-b9db323e7d51",
    "type": "candy"
};

session.should.have.property('uuid').with.a.lengthOf(36);

或者如果您想选择 should 两次,但我认为这不是正确的方法(如下所述)。

var session = {
    "uuid": "60afc3fa-920d-11e5-bd17-b9db323e7d51",
    "type": "candy"
};

session.should.have.property('uuid').which.obj.should.have.length(36);

你可以看到他们在这里工作:

https://jsfiddle.net/Lz2zsoks/

.an.of.a.and.be.have.with.is, .which 只是什么都不做的链接器。

更新

作为对@denbardadym 的回应,我将尝试解释为什么你不应该使用 should 两次:

  • 你不会在自然语言中使用它两次,所以最好不要在测试中使用它
  • Should.js 不打算以这种方式使用。您不会在库文档中找到该用法的任何示例。