toBe (true) vs toBeTruthy () vs toBeTrue ()


165

У чому різниця між expect(something).toBe(true), expect(something).toBeTruthy()і expect(something).toBeTrue()?

Зауважте, що toBeTrue()це спеціальний матч, представлений jasmine-matchersсеред інших корисних та зручних матчів, таких як toHaveMethod()або toBeArrayOfStrings().


Питання має бути загальним, але, як приклад у реальному світі, я перевіряю, чи відображається елемент protractor. Який матч я повинен використовувати в цьому випадку?

expect(elm.isDisplayed()).toBe(true);
expect(elm.isDisplayed()).toBeTruthy();
expect(elm.isDisplayed()).toBeTrue();

3
я думаю .toBe(true)== .toBeTrue(). toBeTruthy () може бути істинним не тільки на true , але і на 123 , "dfgdfg", [1,2,3] і т. д. ... в основному if(x==true)є truthy, в той час if(x===true)як істинні.
dandavis


2
Це залежатиме від того, яке значення ви протестуєте. Використовуйте, toBeTruthyякщо ви не впевнені у своєму типі, він такий же, як і == trueтоді, коли я підозрюю, .toBe(true)це те саме, що === trueмайте на увазі його трохи за борт, щоб викликати функцію для перевірки на справжність. Слово поради,. Забудьте ==і !=існує в Javascript і ніколи не використовуйте його знову. Труті не потрібні і пастка для початківців. Використовуйте ===і !==замість цього.
Сліпий67

@ Blindman67 дякую за пораду, це має ідеальний сенс. Ми навіть eslintповідомляємо про нас, якщо ==або !=використовуємо, що пропонують змінити це на ===та !==.
alecxe

Відповіді:


231

Що я роблю, коли мені цікаво щось подібне до цього питання, - це перейти до джерела.

бути()

expect().toBe() визначається як:

function toBe() {
  return {
    compare: function(actual, expected) {
      return {
        pass: actual === expected
      };
    }
  };
}

Він виконує свій тест, ===що означає, що при використанні як такий expect(foo).toBe(true)він пройде лише в тому випадку, якщо він fooфактично має значення true. Значення Truthy не дозволять пройти тест.

toBeTruthy ()

expect().toBeTruthy() визначається як:

function toBeTruthy() {
  return {
    compare: function(actual) {
      return {
        pass: !!actual
      };
    }
  };
}

Введіть примус

Значення є правдоподібним, якщо примус цього значення до булевого значення дає значення true. Операція !!перевіряє правдивість шляхом примушування значення, переданого булевому значенню expect. Зверніть увагу , що Попри те , що прийнято в даний час відповідь на увазі , == trueце НЕ коректний тест для truthiness. У вас вийдуть кумедні речі на кшталт

> "hello" == true
false
> "" == true
false
> [] == true
false
> [1, 2, 3] == true
false

Беручи до уваги !!врожайність:

> !!"hello"
true
> !!""
false
> !![1, 2, 3]
true
> !![] 
true

(Так, порожній чи ні, масив є правдоподібним.)

toBeTrue ()

expect().toBeTrue()є частиною Жасмін-Матчерс (яка реєструється в 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()?

У кінцевому рахунку Protractor передає цей запит селену. У документації зазначено, що отримана величина .isDisplayed()- це обіцянка, яка відповідає рівню a boolean. Я б взяв це за номінал і використовував .toBeTrue()або .toBe(true). Якщо я знайшов випадок, коли реалізація повертає значення truthy / falesy, я б подала звіт про помилку.


20

У 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()це не те саме, що і те.


2
[] == false;невірне, саме твердження хибне, тому що об'єкти завжди є truthy
dandavis

@dandavis Хороший улов
micah

@dandavis Неправда. Об'єкти не завжди є правдивими. Але це твердження [] == false;єtrue
Миха

2
ні, це не корисно, насправді навпаки: це noob gotcha ... розгляньте [""]==falseабо [0]== false; не порожній, не фальсий, просто оманливий ...
dandavis

2
Використання, x == trueяк ви є у своїх прикладах, є оманливим і, як видно з вищезазначених коментарів, невірним способом проілюструвати поняття правдивості в JavaScript. Справжнє випробування на правдивість у JavaScript - це те, як значення поводиться у ifвисловлюванні чи як операнд у бульовому виразі. Ми знаємо, що 1це правда, тому if (1)що наступне твердження буде оцінено. Точно так само []є істиною з тієї ж причини: Навіть незважаючи на те, що [] == trueоцінюється false, if ([])все-таки буде спричинено наступне твердження, тому ми знаємо, що []це правда.
Йорданія, що працює

13

Відмова : Це лише дика здогадка

Я знаю, що всі люблять легкий для читання список:

  • toBe(<value>) - Повернене значення те саме, що і повернене значення <value>
  • toBeTrue() - Перевіряє, чи повертається значення true
  • toBeTruthy() - Перевірте, чи буде значення при передачі на булеве значення truthy

    Truthy значення все значення, які не є 0, ''(порожній рядок), false, null, NaN, undefinedабо [](порожній масив) *.

    * Зауважте, що під час запуску !![]він повертається true, але при запуску [] == falseтакож повертається true. Це залежить від того, як вона реалізована. Іншими словами:(!![]) === ([] == false)


На вашому прикладі toBe(true)і toBeTrue()дасть ті самі результати.


Порожній масив - фальси.
micah

@MicahWilliamson Дякую! Виправлено відповідь
Ісмаель Мігель

3
порожні масиви на 100% є тривалішими в JSalert(!![])
dandavis

@dandavis [] == trueу вашій консолі виробляє false. [] == falseу вас консоль виробляєtrue
micah

@MicahWilliamson: це тому, що ти порівнюєш рядкову версію масиву (порожній рядок) з істинною. це може заплутати ...
dandavis

1

Там є багато хороших відповідей, я просто хотів додати сценарій, коли використання цих очікувань може бути корисним. Використовуючи 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()приходить в картину. Сподіваюся, це допомагає.


Приємно! Я пам’ятаю - reduce()ввімкнення масиву булевих значень в одне значення і потім застосування toBe(true)чека. Це набагато простіше, дякую.
alecxe
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.