toBe(true) vs toBeTruthy() vs toBeTrue()

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();
178855 次浏览

在javascript中有true和truthys。当某事为真时,它显然是真或假的。当某物为真时,它可能是布尔值,也可能不是,但的“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()与它们中的任何一个都不相同。

Disclamer:这只是一个大胆的猜测

我知道每个人都喜欢易于阅读的清单:

  • toBe(<value>) -返回值与<value>相同
  • toBeTrue() -检查返回值是否为true
  • toBeTruthy() -检查当转换为布尔值时,值是否为真值

    真值是所有不是0''(空字符串),falsenullNaNundefined[](空数组)*的值。

    *注意,当你运行__ABC0时,它会返回__ABC1,但当你运行__ABC2时,它也会返回__ABC1。这取决于它是如何实现的。换句话说:(!![]) === ([] == false) < / p >


在你的例子中,toBe(true)toBeTrue()将产生相同的结果。

当我想知道像这里问的问题时,我所做的就是追根溯源。

托比()

expect().toBe()被定义为:

function toBe() {
return {
compare: function(actual, expected) {
return {
pass: actual === expected
};
}
};
}

它使用===执行测试,这意味着当用作expect(foo).toBe(true)时,只有当foo实际具有true值时,它才会通过。真实的价值观不会让测试通过。

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的一部分(在后面的项目先注册了jasmine-matchers之后,它在npm上被注册为jasmine-expect)。

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()一起使用?

最终量角器把这个请求交给了Selenium。文档声明由.isDisplayed()产生的值是一个解析为boolean的承诺。我会接受它的表面价值,并使用.toBeTrue().toBe(true)。如果我发现实现返回真值/假值的情况,我会提交错误报告。

有很多很好的答案,我只是想添加一个场景,使用这些期望可能会有所帮助。使用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()返回一个值数组,因此当出现.all()时,可以使用toBeTruthy()执行各种期望(getTextisPresent,等等…)。希望这能有所帮助。

在阅读下面的示例时,请记住这种区别

true === true // true
"string" === true // false
1 === true // false
{} === true // false

Boolean("string") === true // true
Boolean(1) === true // true
Boolean({}) === true // true

1. 期望(声明).toBe(真正的)

当传递给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

即使在执行Boolean()时,所有这些语句都将计算为true:

所以你可以把它看作是“严格”比较

2. 期望(声明).toBeTrue ()

这个函数的比较类型与.toBe(true)完全相同,但最近于2019年9月20日在Jasmine版本3.5.0中引入

3.期望(声明).toBeTruthy ()

另一方面,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