Что я делаю, когда мне интересно что-то вроде заданного здесь вопроса, так это перейти к источнику.
быть()
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)как верны истины.