Что я делаю, когда мне интересно что-то вроде заданного здесь вопроса, так это перейти к источнику.
быть()
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
(Да, пустой или нет, массив правдив.)
toBeTrue ()
expect().toBeTrue()
является частью 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()
?
В конечном итоге транспортир передает эту просьбу Селену. В документации говорится, что значение, полученное с .isDisplayed()
помощью обещания, разрешается в boolean
. Я бы взял это по номиналу и использовать .toBeTrue()
или .toBe(true)
. Если бы я нашел случай, когда реализация возвращает значения «истина / ложь», я бы отправил отчет об ошибке.
.toBe(true)
==.toBeTrue()
. toBeTruthy () может быть истинным не только по истине , но по 123 , "dfgdfg", [1,2,3] и т. д ... в основномif(x==true)
верны, в то времяif(x===true)
как верны истины.