toBe(true)与toBeTruthy()与toBeTrue()


165

之间有什么区别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();

3
我认为.toBe(true)== .toBeTrue()。toBeTruthy()不仅可以在真,但在123,“dfgdfg”,[1,2,3],等等...基本上if(x==true)是truthy,而if(x===true)为真真。
dandavis


2
这将取决于您要测试的价值。toBeTruthy如果您不确定类型,请使用它,与== true我怀疑与它相同的类型.toBe(true)相同。请=== true注意,调用函数测试是否为真需要一点时间。忠告。忘记==!=存在于JavaScript和永远不会再使用它。不需要Truthy,也不需要初学者的陷阱。使用===!==代替。
Blindman67

@ Blindman67感谢您的建议,这很合理。我们甚至eslint如果我们的报告==!=使用建议将其更改为===!==
alecxe 2015年

Answers:


231

当我想知道类似此处的问题的内容时,该怎么办?

成为()

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

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

是真实的()

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

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)。如果我发现实现返回真/假值的情况,我将提交错误报告。


20

在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
[] == false;是不正确的,该陈述本身是错误的,因为对象始终是真实的
dandavis

@dandavis良好的渔获

@dandavis不正确。对象并不总是真实的。但是那个说法[] == false;true
米迦

2
不,这没有用,实际上相反:这是菜鸟陷阱……考虑[""]==false[0]== false;不是空的,不是假的,只是在欺骗……
dandavis

2
x == true如您在示例中那样使用,会产生误导,并且如上面的注释所示,这是错误的方式来说明JavaScript中真实性的概念。JavaScript中真实性的真正测试是值在if语句中的行为或布尔表达式中的操作数的行为。我们知道这1是真实的,因为这if (1)将导致对下一条语句进行评估。[]出于同样的原因,同样是真实的:即使[] == true评估为falseif ([])仍然会导致下[]一条语句被评估,所以我们知道是真实的。
乔丹(Jordan)2015年

13

Disclamer:这只是一个疯狂的猜测

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

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

    Truthy值是不是所有的值0''(空字符串), ,false,,null 或(空数组)*。NaNundefined[]

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


在你的榜样,toBe(true)toBeTrue()会产生相同的结果。


空数组是错误的。
米迦

@MicahWilliamson谢谢!修正了答案
Ismael Miguel 2015年

3
空数组在JS中是100%真实alert(!![])
-dandavis

[] == true控制台中的@dandavis 产生false[] == false在您的控制台中产生true
micah

@MicahWilliamson:这是因为您正在将数组的字符串版本(空字符串)与true进行比较。这可能会令人困惑……
dandavis

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()返回值的阵列等各种预期(getTextisPresent等...)可以与执行toBeTruthy().all()进入图片。希望这可以帮助。


真好!我记得- reduce()将布尔数组变成单个值,然后应用toBe(true)检查。这要简单得多,谢谢。
alecxe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.