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

expect(something).toBe(true)expect(something).toBeTruthy()expect(something).toBeTrue()什么expect(something).toBeTrue()

请注意, toBeTrue()是一个自定义匹配器,jasmine-matchers toBeTrue() 器中引入了其他有用的方便的匹配器,如toHaveMethod()toBeArrayOfStrings()


这个问题是泛泛而谈的,但是,作为一个真实世界的例子,我正在testing一个元素是在protractor显示的。 我应该在这种情况下使用哪个匹配器?

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

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

成为()

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

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

它使用===执行testing,这意味着当用作expect(foo).toBe(true) ,只有当foo的值为true时才会通过testing。 Truthy值不会使testing通过。

toBeTruthy()

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

 function toBeTruthy() { return { compare: function(actual) { return { pass: !!actual }; } }; } 

types强制

如果强制将此值强制为布尔值,则值为true 。 操作!! 通过将传递的值强制为一个布尔值来testing真实性。 请注意,与目前接受的答案所暗示的相反, == true 并不是对真实性的正确testing。 你会得到像有趣的事情

 > "hello" == true false > "" == true false > [] == true false > [1, 2, 3] == true false 

而使用!! 收益率:

 > !!"hello" true > !!"" false > !![1, 2, 3] true > !![] true 

(是的,空的或不空的,一个数组是真的。)

是真实的()

expect().toBeTrue()是Jasmine- expect().toBeTrue()一部分(在npm上作为jasmine-expect注册,在后来的项目中注册了jasmine-matchers之后jasmine-expect )。

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

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

expect().toBeTrue()expect().toBe(true)在于expect().toBeTrue()testing它是否处理Boolean对象。 expect(new Boolean(true)).toBe(true)会失败,而expect(new Boolean(true)).toBeTrue()会通过。 这是因为这个有趣的事情:

 > new Boolean(true) === true false > new Boolean(true) === false false 

至less这是真的:

 > !!new Boolean(true) true 

哪一个最适合与elem.isDisplayed()

最终量angular器把这个要求交给了Selenium。 该文档指出, .isDisplayed()生成的值是一个parsing为boolean的承诺。 我会采取它的面值,并使用.toBeTrue().toBe(true) 。 如果我发现一个实现返回真/假值的情况,我会提交一个错误报告。

在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 

这可以使事情变得更简单,如果你想检查一个string是否设置或数组有任何值。

 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() – 检查转换为布尔值时的值是否为真值

    Truthy值是不是0'' (空string), falsenullNaNundefined[] (空数组)*的值。

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


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

有很多很好的答案,我只是想增加一个scheme,这些期望的使用可能会有所帮助。 使用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()返回值的数组,所以当toBeTruthy()进入图片时,可以用toBeTruthy()来执行各种期望( getTextisPresent等)。 希望这可以帮助。