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

时间:2015-09-16 18:10:01

标签: javascript testing jasmine protractor jasmine-matchers

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();

5 个答案:

答案 0 :(得分:155)

当我想知道这里提出的问题之类的问题时,我会这样做。

砥()

expect().toBe()定义为:

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

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

toBeTruthy()

expect().toBeTruthy()定义为:

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

类型强制

如果将此值强制为布尔值,则值为真有效值true。操作!!通过将传递给expect的值强制转换为布尔值来测试真实性。请注意,与当前接受的答案implies相反,== 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-expect的项目之后,在{n}注册为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。 documentation表示.isDisplayed()生成的值是一个解析为boolean的承诺。我会按面值使用.toBeTrue().toBe(true)。如果我发现实现返回truthy / falsy值的情况,我会提交错误报告。

答案 1 :(得分:15)

在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 :(得分:10)

  

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

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

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

    Truthy值均为非0''(空字符串),falsenullNaN,{{1}的所有值}或undefined(空数组)*。

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

在您的示例中,(!![]) === ([] == false)toBe(true)会产生相同的结果。

答案 3 :(得分:3)

在阅读以下示例时,请记住这种差异

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

但是

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

1. expect(statement).toBe(true)

当传递给 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(statement).toBeTrue()

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

3. expect(statement).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

答案 4 :(得分: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()会返回一系列值,因此当{getText isPresent时可以执行toBeTruthy().all()等... {1}}出现了。希望这会有所帮助。