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は()時のみならず、真であることができるが、時123、等「dfgdfg」、[1,2,3]、...基本的にif(x==true)しながら、truthyあるif(x===true)真真です。
dandavis


2
これは、テストしている値が何であるかによって異なります。toBeTruthyタイプがわからない場合に使用します。それは== true.toBe(true)=== trueマインドと同じだと思うのと同じですが、true かどうかをテストする関数を呼び出すのは少しやりすぎです。アドバイスの言葉。忘れ==!=JavaScriptで存在し、それを再度使用することはありません。真実は必要ではなく、初心者のための罠です。使用===して!==代わりに。
Blindman67 2015

@ Blindman67アドバイスありがとうございます。私たちもしているeslint場合は、私たちを報告する==!=にそれを変更するために示唆され使用されている===!==
alecxe 2015

回答:


231

ここで尋ねられた質問のようなものが疑問に思ったときに私がすることは、ソースに行くことです。

することが()

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

(はい、空かどうか、配列は真実です。)

真であります()

expect().toBeTrue()Jasmine-Matchersの一部です(これはjasmine-expectjasmine-matchers最初に登録された後のプロジェクトの後でnpmに登録されます)。

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()ですか。

最終的に分度器はこの要求をセレンに引き渡します。ドキュメントによって生成される値があること状態.isDisplayed()に解決されることを約束ですboolean。それを額面通りにして、.toBeTrue()またはを使用します.toBe(true)。実装が真/偽の値を返すケースを見つけた場合、バグレポートを提出します。


20

JavaScriptには真実と真実があります。何かが真実であるとき、それは明らかに真実か偽りです。何かが真実である場合、それはブール値である場合とそうでない場合がありますが、「キャスト」値はブール値です。

例。

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;オブジェクトが常に真実であるので、ステートメント自体は正しくありません
dandavis '16

@dandavisグッドキャッチ
micah 2015

@dandavis真実ではない。オブジェクトは常に真実であるとは限りません。しかし、その声明[] == false;true
micah

2
いいえ、それは役に立たない、実際には反対です。それは、初心者の落とし穴です...検討する[""]==false[0]== false、; 空ではなく、虚偽ではなく、ただ欺く...
ダンダビス'16

2
x == true例のように使用することは誤解を招きやすく、上記のコメントが示すように、JavaScriptの真実性の概念を説明する誤った方法です。JavaScriptでの真実性の真のテストは、値がifステートメント内で、またはブール式のオペランドとしてどのように動作するかです。次のステートメントが評価されるので、私たち1は真実であることを知っif (1)ています。同様に、[]同じ理由truthyです:にもかかわらず[] == true評価するにはfalseif ([])我々は知っているので、まだ、次のステートメントが評価されるようになります[]truthyです。
ジョーダン

13

Disclamer:これは単なる推測です

私は誰もが読みやすいリストを愛していることを知っています:

  • toBe(<value>) -戻り値は同じです <value>
  • toBeTrue() -戻り値が true
  • toBeTruthy() -値をブール値にキャストしたときに、真の値になるかどうかを確認します

    Truthy値がないすべての値であり0''(空文字列)、 、false、、null または(空の配列)*。NaNundefined[]

    *実行する!![]と戻りますがtrue、実行[] == falseすると戻りますtrue。実装方法によって異なります。言い換えると:(!![]) === ([] == false)


あなたの例では、toBe(true)toBeTrue()同じ結果が得られます。


空の配列は偽です。
micah 2015

@MicahWilliamsonありがとう!答えを修正しました
Ismael Miguel

3
JSでは空の配列は100%真実ですalert(!![])
dandavis '16 / 09/15

[] == trueコンソールの@dandavis が生成しますfalse[] == falseあなたのコンソールで生成されますtrue
micah '16

@MicahWilliamson:これは、配列の文字列バージョン(空の文字列)をtrueと比較しているためです。混乱する可能性があります...
dandavis '16 / 09/15

1

良い答えはたくさんありますが、これらの期待の使い方が役立つシナリオを追加したいと思います。を使用してelement.all(xxx)、すべての要素が1回の実行で表示されるかどうかを確認する必要がある場合、実行できます-

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()値の配列を返し、期待のすべての種類のように(getTextisPresentなど)を用いて行うことができるtoBeTruthy()場合に.all()画像になります。お役に立てれば。


いいね!reduce()ブール値の配列を単一の値に変換してから、toBe(true)チェックを適用したことを覚えています。これはずっと簡単です、ありがとう。
alecxe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.