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),false
,null
,NaN
,undefined
或[]
(空数组)*的值。*注意当你运行
!![]
,它返回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()
来执行各种期望( getText
, isPresent
等)。 希望这可以帮助。