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();
ここで尋ねられた質問のような何かを疑問に思うとき私がすることは情報源に行くことです。
expect().toBe()
は次のように定義されます。
function toBe() {
return {
compare: function(actual, expected) {
return {
pass: actual === expected
};
}
};
}
===
でテストを実行します。つまり、expect(foo).toBe(true)
として使用した場合、foo
が実際にtrue
の値を持っている場合にのみ合格します。真の値はテストに合格しません。
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)
を使用します。実装が真偽値を返す場合を見つけたら、バグレポートを提出します。
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()
はこれらのいずれとも同じではありません。
Disclamer:これは単なるワイルドな推測です
私は誰もが読みやすいリストを愛していることを知っています:
toBe(<value>)
-返される値は<value>
と同じですtoBeTrue()
-戻り値がtrue
かどうかを確認しますtoBeTruthy()
-値がブール値にキャストされたときに、真の値になるかどうかを確認します
真の値は、0
、''
(空の文字列)、false
、null
、NaN
、undefined
、または[]
(空の配列)*ではないすべての値です。
* !![]
を実行すると、true
が返されますが、[] == false
を実行すると、true
も返されます。実装方法によって異なります。つまり、(!![]) === ([] == false)
あなたの例では、toBe(true)
とtoBeTrue()
は同じ結果になります。
そこにはたくさんの良い答えがあります。これらの期待の使い方が役立つシナリオを追加したかっただけです。 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()
を使用して、あらゆる種類の期待値(getText
、isPresent
など)を実行できます。お役に立てれば。