1. ホーム
  2. ジャバスクリプト

[解決済み】toBe(true) vs toBeTruthy() vs toBeTrue()

2022-04-17 01:38:57

質問

とはどのような違いがあるのでしょうか? 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();

解決方法は?

ここで質問されたようなことを疑問に思ったとき、私がすることは、ソースを見に行くことです。

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() の一部です。 ジャスミンマッチャー (として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 はこのリクエストを Selenium に引き渡します。このリクエストは ドキュメント が生成する値は .isDisplayed() を解決するプロミスです。 boolean . 私なら額面通りに受け取って .toBeTrue() または .toBe(true) . もし、この実装が真偽不明の値を返すようなケースを見つけたら、バグレポートを提出しようと思っています。