225

expect(something).toBe(true)expect(something).toBeTruthy()和有什么区别expect(something).toBeTrue()

请注意,这toBeTrue()是在其他有用且方便的匹配器(如or )中引入的自定义匹配器。jasmine-matcherstoHaveMethod()toBeArrayOfStrings()


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

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

5 回答 5

290

当我想知道这里提出的问题时,我会做的是去源头。

成为()

expect().toBe()定义为:

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

它执行它的测试,===这意味着当使用 as 时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

(是的,无论是否为空,数组都是真实的。)

是真实的()

expect().toBeTrue()Jasmine-Matchers的一部分(它在 npm 上注册,就像jasmine-expect在后面的项目jasmine-matchers首先注册之后一样)。

expect().toBeTrue()定义为:

function toBeTrue(actual) {
  return actual === true ||
    is(actual, 'Boolean') &&
    actual.valueOf();
}

expect().toBeTrue()and的区别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()or .toBe(true)。如果我发现实现返回真/假值的情况,我会提交错误报告。

于 2015-09-24T17:26:50.497 回答
30

免责声明:这只是一个疯狂的猜测

我知道每个人都喜欢易于阅读的列表:

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

    真实值是所有不是0, ''(empty string), false, null, NaN,undefined[](empty array)* 的值。

    * 请注意,当您运行时!![],它会返回true,但当您运行时,[] == false它也会返回true。这取决于它是如何实现的。换句话说:(!![]) === ([] == false)


在您的示例中,toBe(true)toBeTrue()产生相同的结果。

于 2015-09-16T18:17:09.980 回答
24

在javascript中有trues和truthys。当某事为真时,它显然是真或假。当某事是真的时,它可能是也可能不是布尔值,但“转换”值是布尔值。

例子。

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()与其中任何一个都不相同。

于 2015-09-16T18:15:10.540 回答
3

当您阅读下面的示例时,请记住这种差异

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

即使所有这些语句都会在执行以下操作true时进行评估Boolean()

因此,您可以将其视为“严格”比较

2.expect(语句).toBeTrue()

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

3.expect(语句).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
于 2021-02-08T22:41:14.507 回答
2

那里有很多很好的答案,我只是想添加一个场景,使用这些期望可能会有所帮助。使用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, , 等...) 。希望这可以帮助。isPresenttoBeTruthy().all()

于 2016-01-06T12:01:47.633 回答