expect(something).toBe(true)
,expect(something).toBeTruthy()
和expect(something).toBeTrue()
之间有什么区别?
请注意,toBeTrue()
是jasmine-matchers
中引入的自定义匹配器以及其他有用且方便的匹配器,例如toHaveMethod()
或toBeArrayOfStrings()
。
这个问题是通用的,但是,作为一个真实的例子,我正在测试一个元素是否显示在protractor
中。在这种情况下我应该使用哪种匹配器?
expect(elm.isDisplayed()).toBe(true);
expect(elm.isDisplayed()).toBeTruthy();
expect(elm.isDisplayed()).toBeTrue();
答案 0 :(得分:155)
当我想知道这里提出的问题之类的问题时,我会这样做。
expect().toBe()
定义为:
function toBe() {
return {
compare: function(actual, expected) {
return {
pass: actual === expected
};
}
};
}
它使用===
执行测试,这意味着当用作expect(foo).toBe(true)
时,仅当foo
实际具有值true
时才会通过。 Truthy值不会使测试通过。
function toBeTruthy() {
return {
compare: function(actual) {
return {
pass: !!actual
};
}
};
}
如果将此值强制为布尔值,则值为真有效值true
。操作!!
通过将传递给expect
的值强制转换为布尔值来测试真实性。请注意,与当前接受的答案implies相反,== true
不是对正确性的正确测试。你会得到像
> "hello" == true
false
> "" == true
false
> [] == true
false
> [1, 2, 3] == true
false
使用!!
产生:
> !!"hello"
true
> !!""
false
> !![1, 2, 3]
true
> !![]
true
(是的,空的或不是,数组是真的。)
expect().toBeTrue()
是Jasmine-Matchers的一部分(在稍后注册jasmine-expect
的项目之后,在{n}注册为jasmine-matchers
。
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()
一起使用?最终,量角器将此请求交给了Selenium。 documentation表示.isDisplayed()
生成的值是一个解析为boolean
的承诺。我会按面值使用.toBeTrue()
或.toBe(true)
。如果我发现实现返回truthy / falsy值的情况,我会提交错误报告。
答案 1 :(得分:15)
在javascript中有真实和真实。当事情成真时,显然是真或假。当某些东西真实时,它可能是也可能不是布尔值,但“cast”值是布尔值。
实施例
true == true; // (true) true
1 == true; // (true) truthy
"hello" == true; // (true) truthy
[1, 2, 3] == true; // (true) truthy
[] == false; // (true) truthy
false == false; // (true) true
0 == false; // (true) truthy
"" == false; // (true) truthy
undefined == false; // (true) truthy
null == false; // (true) truthy
如果要检查是否设置了字符串或数组是否有任何值,这可以使事情更简单。
var users = [];
if(users) {
// this array is populated. do something with the array
}
var name = "";
if(!name) {
// you forgot to enter your name!
}
如上所述。 expect(something).toBe(true)
和expect(something).toBeTrue()
是相同的。但是expect(something).toBeTruthy()
与其中任何一个都不一样。
答案 2 :(得分:10)
Disclamer :这只是一个疯狂的猜测
我知道每个人都喜欢易于阅读的清单:
toBe(<value>)
- 返回的值与<value>
toBeTrue()
- 检查返回的值是否为true
toBeTruthy()
- 检查当转换为布尔值时,该值是否为真值
Truthy值均为非0
,''
(空字符串),false
,null
,NaN
,{{1}的所有值}或undefined
(空数组)*。
*请注意,当您运行[]
时,它会返回!![]
,但当您运行true
时,它也会返回[] == false
。这取决于它是如何实现的。换句话说:true
在您的示例中,(!![]) === ([] == false)
和toBe(true)
会产生相同的结果。
答案 3 :(得分:3)
在阅读以下示例时,请记住这种差异
true === true // true
"string" === true // false
1 === true // false
{} === true // false
但是
Boolean("string") === true // true
Boolean(1) === true // true
Boolean({}) === true // true
当传递给 expect()
的语句计算结果为 true
时,断言通过
expect(true).toBe(true) // pass
expect("123" === "123").toBe(true) // pass
在所有其他情况下它都会失败
expect("string").toBe(true) // fail
expect(1).toBe(true); // fail
expect({}).toBe(true) // fail
即使所有这些语句在执行 true
时都会评估为 Boolean()
:
因此您可以将其视为“严格”比较
这个与 .toBe(true)
进行的比较类型完全相同,但最近于 2019 年 9 月 20 日在 Jasmine 版本 3.5.0
中引入
toBeTruthy
另一方面,首先将语句的输出评估为布尔值,然后进行比较
expect(false).toBeTruthy() // fail
expect(null).toBeTruthy() // fail
expect(undefined).toBeTruthy() // fail
expect(NaN).toBeTruthy() // fail
expect("").toBeTruthy() // fail
expect(0).toBeTruthy() // fail
并且在所有其他情况下它会通过,例如
expect("string").toBeTruthy() // pass
expect(1).toBeTruthy() // pass
expect({}).toBeTruthy() // pass
答案 4 :(得分:1)
那里有很多很好的答案,我只是想添加一个场景,这些期望的使用可能会有所帮助。使用element.all(xxx)
,如果我需要检查一次运行是否显示所有元素,我可以执行 -
expect(element.all(xxx).isDisplayed()).toBeTruthy(); //Expectation passes
expect(element.all(xxx).isDisplayed()).toBe(true); //Expectation fails
expect(element.all(xxx).isDisplayed()).toBeTrue(); //Expectation fails
原因.all()
会返回一系列值,因此当{getText
isPresent
时可以执行toBeTruthy()
,.all()
等... {1}}出现了。希望这会有所帮助。