toBe (true) - toBeTruthy () vs toBeTrue () karşılaştırması


165

Ne arasındaki farktır expect(something).toBe(true), expect(something).toBeTruthy()ve expect(something).toBeTrue()?

Not toBeTrue()bir olan özel eşleştirici tanıtıldı jasmine-matchersgibi diğer faydalı ve kullanışlı matchers arasında toHaveMethod()veya toBeArrayOfStrings().


Soru genel olmalı, ancak gerçek dünya örneği olarak, bir öğenin görüntülendiğini test ediyorum protractor. Bu durumda hangi eşleştiriciyi kullanmalıyım?

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

3
.toBe(true)== olduğunu düşünüyor .toBeTrue(). toBeTruthy () üzerine sadece doğru olabilir doğrudur ama üzerine 123 , vs "dfgdfg", [1,2,3], ... temelde if(x==true)iken, truthy olan if(x===true)gerçek doğrudur.
dandavis


2
Bu, test ettiğiniz değerin ne olduğuna bağlı olacaktır. Kullan toBeTruthysen tip emin değilseniz o aynıdır == trueSanıyorum iken .toBe(true)aynıdır === trueAkıl true için teste bir işlevi çağırmak için onun biraz denize. Tavsiye sözü,. Javascript'te unutun ==ve !=var olun ve bir daha asla kullanmayın. Gerçeğe ihtiyaç yoktur ve yeni başlayanlar için bir tuzak. Kullanın ===ve !==bunun yerine.
Blindman67

@ Blindman67 Tavsiye için teşekkürler, mükemmel bir mantıklı. Hatta ve olarak değiştirilmesini öneren veya kullanıldıklarını eslintbildirdik . ==!====!==
alecxe

Yanıtlar:


231

Burada sorulan soru gibi bir şeyi merak ettiğimde yaptığım şey kaynağa gitmek.

olmak()

expect().toBe() olarak tanımlanır:

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

Testini, ===olduğu gibi kullanıldığında expect(foo).toBe(true), yalnızca foogerçekten değere sahipse geçeceği anlamına gelir true. Gerçek değerler testi geçemez.

toBeTruthy ()

expect().toBeTruthy() olarak tanımlanır:

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

Tip baskı

Bu değerin bir boole zorlaması değeri verirse bir değer doğrudur true. İşlem , bir boole !!aktarılan değeri zorlayarak gerçekliği test eder expect. Aksine şu anda kabul cevabı ne Not ima , == trueolduğu değil doğruluğuna ilişkin doğru bir testi. Gibi komik şeyler alacaksın

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

Oysa !!verim kullanılırken :

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

(Evet, boş veya değil, bir dizi doğrudur.)

doğru olmak()

expect().toBeTrue()bir parçası olan Yasemin-matchers (aynı NPM üzerine kayıtlı jasmine-expectbir sonraki projesi kayıtlı sonra jasmine-matchersilk).

expect().toBeTrue() olarak tanımlanır:

function toBeTrue(actual) {
  return actual === true ||
    is(actual, 'Boolean') &&
    actual.valueOf();
}

İle farkı expect().toBeTrue()ve expect().toBe(true)olmasıdır expect().toBeTrue()o uğraşıyor olmadığını testler Booleannesne. expect(new Boolean(true)).toBe(true)başarısız olurken expect(new Boolean(true)).toBeTrue()geçerdi. Bu komik şey yüzünden:

> new Boolean(true) === true
false
> new Boolean(true) === false
false

En azından doğrudur:

> !!new Boolean(true)
true

Hangisi ile kullanım için en uygun elem.isDisplayed()?

Nihayet İletki, Selenyum'a bu isteği iletir. Dokümantasyon ürettiği değer belirten .isDisplayed()bir karşı giderir olduğu bir sözdür boolean. Nominal değere alırdım .toBeTrue()ya da .toBe(true). Uygulamanın doğruluk / falsy değerleri döndürdüğü bir durum bulduğumda, bir hata raporu hazırlarım.


20

Javascript'te doğrular ve gerçekler var. Bir şey doğru olduğunda, açıkça doğru veya yanlıştır. Bir şey doğruysa, bir boolean olabilir veya olmayabilir, ancak "cast" değeri bir boolean.

Örnekler.

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

Bir dizenin ayarlanıp ayarlanmadığını veya bir dizinin herhangi bir değere sahip olup olmadığını kontrol etmek istiyorsanız, işleri kolaylaştırır.

var users = [];

if(users) {
  // this array is populated. do something with the array
}

var name = "";

if(!name) {
  // you forgot to enter your name!
}

Ve belirtildiği gibi. expect(something).toBe(true)ve expect(something).toBeTrue()aynı. Ama expect(something).toBeTruthy()ikisiyle de aynı değil.


2
[] == false;doğru değil, ifadenin kendisi yanlıştır çünkü nesneler her zaman doğrudur
dandavis

@dandavis İyi yakalama
micah

@dandavis Doğru değil. Nesneler her zaman doğru değildir. Ama bu deyim [] == false;olduğunutrue
micah

2
hayır, yararlı değil, aslında tam tersi: bu bir noob gotcha ... düşün [""]==falseya da [0]== false; boş değil,
falsey

2
x == trueÖrneklerinizde olduğu gibi kullanmak , yanıltıcıdır ve yukarıdaki yorumların gösterdiği gibi, JavaScript'teki doğruluk kavramını göstermek için yanlış bir yoldur. JavaScript'teki gerçek doğruluk testi, bir değerin bir ififadede veya boole ifadesinde bir işlenen olarak nasıl davrandığıdır . Biliyoruz 1çünkü truthy olan if (1)bir sonraki deyimi değerlendirilmesine sebep olur. Aynı şekilde [], aynı nedenle truthy geçerli: olsa [] == trueiçin değerlendirir false, if ([])yine bir sonraki deyimi neden olur değerlendirilecek, biliyoruz bu yüzden []truthy olduğunu.
Ürdün Koşu

13

Yasal Uyarı : Bu sadece vahşi bir tahmin

Herkesin okuması kolay bir listeyi sevdiğini biliyorum:

  • toBe(<value>) - Döndürülen değer ile aynı <value>
  • toBeTrue() - Döndürülen değerin true
  • toBeTruthy() - Bir boole değerine kullanıldığında değerin gerçek bir değer olup olmadığını kontrol edin

    Truthy değerler olmayan tüm değerleri vardır 0, ''(boş dize), false, null, NaN, undefinedveya [](boş dizi) *.

    * Çalıştırdığınızda !![]döndüğüne dikkat edin, trueçalıştırdığınızda [] == falseda geri döner true. Nasıl uygulandığına bağlıdır. Diğer bir deyişle:(!![]) === ([] == false)


Senin Örneğin günü, toBe(true)ve toBeTrue()aynı sonuçlar verecektir.


Boş bir dizi falsey.
micah

@MicahWilliamson Teşekkürler! Cevap düzeltildi
Ismael Miguel

3
boş diziler JS'de% 100 doğruduralert(!![])
dandavis

@dandavis [] == truekonsolunuzda üretir false. [] == falsekonsolda üretirtrue
micah

@MicahWilliamson: Bunun nedeni dizinin dize sürümünü (boş dize) true ile karşılaştırmanızdır. kafa karıştırıcı olabilir ...
dandavis

1

Orada çok iyi cevaplar var, sadece bu beklentilerin kullanımının yararlı olabileceği bir senaryo eklemek istedim. Kullanarak element.all(xxx), tüm öğelerin tek bir çalışmada görüntülenip görüntülenmediğini kontrol etmem gerekirse,

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

Sebep olarak .all()bir değer dizisi döndürür ve beklentilerini her türlü böylece ( getText, isPresentvb ...) ile yapılabilir toBeTruthy()zaman .all()gündeme gelmektedir. Bu yardımcı olur umarım.


Güzel! reduce()Booleans dizisini tek bir değere hatırlıyorum ve sonra toBe(true)çeki uyguluyorum . Bu çok daha basit, teşekkürler.
alecxe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.