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 87

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