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()входит в картину. Надеюсь, это поможет.