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等)。 希望这可以帮助。