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 不打算以这种方式使用。您不会在库文档中找到该用法的任何示例。
我有一个这样的对象:
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 不打算以这种方式使用。您不会在库文档中找到该用法的任何示例。