toBe (true) vs toBeTruthy () vs toBeTrue()
в чем разница между expect(something).toBe(true)
,expect(something).toBeTruthy()
и expect(something).toBeTrue()
?
отметим, что toBeTrue()
это custom matcher представил в jasmine-matchers
среди других полезных и удобных вычислителей, как toHaveMethod()
или toBeArrayOfStrings()
.
вопрос должен быть общим, но, как пример реального мира, я тестирую, что элемент отображается в protractor
. Совпадений, которые я должен использовать в этом случае?
expect(elm.isDisplayed()).toBe(true);
expect(elm.isDisplayed()).toBeTruthy();
expect(elm.isDisplayed()).toBeTrue();
4 ответа:
что я делаю, когда мне интересно, что-то вроде вопроса, заданного здесь, идет к источнику.
toBe ()
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()
является частью Жасмин-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()
проверяет, имеет ли он дело с
в 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
Это может сделать вещи проще, если вы хотите проверить, если строка имеет значение или массив имеет никакого значения.
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()
- проверьте, будет ли значение, приведенное к логическому значению, истинным значениемистинные значения-это все значения, которые не являются
0
,''
(пустая строка),false
,null
,NaN
,undefined
или[]
(пустой массив)*.* обратите внимание, что при запуске
!![]
возвращаетtrue
, но при запуске[] == false
она также возвращаетtrue
. Это зависит от того, как она реализуется. Другими словами:(!![]) === ([] == false)
на примере
toBe(true)
иtoBeTrue()
даст те же результаты.
есть много много хороших ответов там, я просто хотел добавить сценарий, где использование этих ожиданий может быть полезно. Используя
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()
возвращает массив значений, и поэтому всякого рода ожидания(getText
,isPresent
и т. д...) может быть выполнена сtoBeTruthy()
, когда.all()
входит в картину. Надеюсь, это поможет.