web-dev-qa-db-ja.com

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

expect(something).toBe(true)expect(something).toBeTruthy()expect(something).toBeTrue()の違いは何ですか?

toBeTrue()toHaveMethod()toBeArrayOfStrings()のような便利で便利なマッチャーの中で jasmine-matchers で導入されたカスタムマッチャーです。


この質問は一般的なものですが、実際の例として、要素がprotractorに表示されることをテストしています。この場合どのマッチャーを使うべきですか?

expect(Elm.isDisplayed()).toBe(true);
expect(Elm.isDisplayed()).toBeTruthy();
expect(Elm.isDisplayed()).toBeTrue();
116
alecxe

ここで尋ねられた質問のような何かを疑問に思うとき私がすることは情報源に行くことです。

することが()

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-expectを登録した後にnpmに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()での使用に最適なものはどれですか?

最終的に分度器はSeleniumにこの要求を渡します。 のドキュメント には、.isDisplayed()によって生成される値はbooleanに解決されることが約束されていると記載されています。私はそれを額面どおりにとり、.toBeTrue()または.toBe(true)を使用します。実装が真偽値を返す場合を見つけたら、バグレポートを提出します。

158
Louis

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()はこれらのいずれとも同じではありません。

15
micah

Disclamer:これは単なるワイルドな推測です

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

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

    真の値は、0''(空の文字列)、falsenullNaNundefined、または[](空の配列)*ではないすべての値です。

    * !![]を実行すると、trueが返されますが、[] == falseを実行すると、trueも返されます。実装方法によって異なります。つまり、(!![]) === ([] == false)


あなたの例では、toBe(true)toBeTrue()は同じ結果になります。

11
Ismael Miguel

そこにはたくさんの良い答えがあります。これらの期待の使い方が役立つシナリオを追加したかっただけです。 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()である理由は、値の配列を返すため、toBeTruthy()が表に出たときに、.all()を使用して、あらゆる種類の期待値(getTextisPresentなど)を実行できます。お役に立てれば。

1
Girish Sortur