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

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

请注意,这是在茉莉花匹配器中引入的自定义匹配器,以及其他有用且方便的匹配器,如 或 。toBeTrue()toHaveMethod()toBeArrayOfStrings()


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

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

答案 1

当我想知道像这里提出的问题一样的事情时,我会怎么做,那就是去源头。

toBe()

expect().toBe() 定义为:

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

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

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的一部分(在npm上注册,因为在后来的项目首先注册之后)。jasmine-expectjasmine-matchers

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

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

与 和 的区别在于,它测试它是否正在处理一个对象。 会失败,而会通过。这是因为这个有趣的事情:expect().toBeTrue()expect().toBe(true)expect().toBeTrue()Booleanexpect(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)


答案 2

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

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

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

    真实值是所有不是 、 (空字符串)、、 、 或 (空数组)* 的值。0''falsenullNaNundefined[]

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


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