expect(something).toBe(true), expect(something).toBeTruthy()和expect(something).toBeTrue()之间的区别是什么?

请注意,toBeTrue()是在jasmine匹配器中引入的自定义匹配器,其他的匹配器如toHaveMethod()或toBeArrayOfStrings()。


这个问题应该是通用的,但是作为一个真实的例子,我正在测试一个元素是否显示在量角器中。在这种情况下,我应该使用哪个匹配器?

expect(elm.isDisplayed()).toBe(true);
expect(elm.isDisplayed()).toBeTruthy();
expect(elm.isDisplayed()).toBeTrue();

当前回答

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

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

But

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完全相同类型的比较(正确),但最近在2019年9月20日的3.5.0版本中引入了Jasmine

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

其他回答

免责声明:这只是一个大胆的猜测

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

toBe(<value>)—返回值与<value>相同 toBeTrue() -检查返回值是否为true toBeTruthy() -检查该值在转换为布尔值时是否为真值 真值是所有不为0、”(空字符串)、false、null、NaN、undefined或[](空数组)*的值。 *注意当你跑步的时候!![],它返回true,但是当你运行[]== false时,它也返回true。这取决于它是如何实现的。换句话说:(!![])=== ([]== false)


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

在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()与这两个都不一样。

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

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

But

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完全相同类型的比较(正确),但最近在2019年9月20日的3.5.0版本中引入了Jasmine

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

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

优贝()

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()测试它是否在处理一个布尔对象。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

哪个最适合与element . isdisplays()一起使用?

最终量角器把这个请求交给了Selenium。文档声明. isdisplay()生成的值是一个解析为布尔值的承诺。我会接受它的表面价值,并使用. 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()执行各种期望(getText, isPresent等…)。希望这能有所帮助。