当我对像这里提出的问题产生疑惑时,我会去查阅来源。
toBe()
expect().toBe()
的定义如下:
function toBe() {
return {
compare: function(actual, expected) {
return {
pass: actual === expected
};
}
};
}
它使用 ===
进行测试,这意味着当使用 expect(foo).toBe(true)
时,仅当 foo
实际上具有值true
时,测试才通过。Truthy值不会使测试通过。
toBeTruthy()
expect().toBeTruthy()
被定义为:
function toBeTruthy() {
return {
compare: function(actual) {
return {
pass: !!actual
};
}
};
}
类型强制转换
当将某个值转换为布尔类型并得到值 true
时,该值被称为真值。操作符 !!
通过将传递给 expect
的值强制转换为布尔类型来测试其是否为真值。需要注意的是,与当前被接受的回答所暗示的内容相反,== true
不是正确测试真值的方法。你可能会遇到一些奇怪的情况。
> "hello" == true
false
> "" == true
false
> [] == true
false
> [1, 2, 3] == true
false
而使用!!
则会得到:
> !!"hello"
true
> !!""
false
> !![1, 2, 3]
true
> !![]
true
(是的,无论数组是否为空,都是真实值。)
toBeTrue()
expect().toBeTrue()
是 Jasmine-Matchers 的一部分(注册在 npm 上作为 jasmine-expect
,后来另一个项目先注册了jasmine-matchers
)。
expect().toBeTrue()
的定义如下:
function toBeTrue(actual) {
return actual === true ||
is(actual, 'Boolean') &&
actual.valueOf();
}
expect().toBeTrue()
与
expect().toBe(true)
的区别在于
expect().toBeTrue()
测试它是否处理一个
Boolean
对象。
expect(new Boolean(true)).toBe(true)
会失败,而
expect(new Boolean(true)).toBeTrue()
会通过。这是因为有趣的事情是:
> new Boolean(true) === true
false
> new Boolean(true) === false
false
至少它是真实的:
> !!new Boolean(true)
true
哪个最适合与elem.isDisplayed()
一起使用?
最终,Protractor将此请求交给Selenium。 文档 指出,.isDisplayed()
返回的值是一个解析为boolean
的承诺。我会以面值接受它并使用.toBeTrue()
或.toBe(true)
。如果我发现实现返回真值/假值的情况,我会提交错误报告。
.toBe(true)
等同于.toBeTrue()
。toBeTruthy()
可以不仅在true
时为真,也可以在123
、"dfgdfg"
、[1,2,3]
等情况下为真,基本上if(x==true)
是“真值”,而if(x===true)
是“真的真值”。 - dandavistoBeTruthy
,它与== true
相同,而我怀疑.toBe(true)
与=== true
相同。请注意,调用函数来测试真实性有点过分了。建议,忘记在Javascript中存在==
和!=
,永远不要再使用它们。Truthy 对于初学者来说并不需要,是一个陷阱。改用===
和!==
。 - Blindman67eslint
来报告是否使用了==
或!=
,并建议将其更改为===
和!==
。 - alecxe