[解決済み] JasmineのJavaScriptテスト - toBeとtoEqualの比較
質問
例えば、次のようなものがあるとします。
var myNumber = 5;
expect(myNumber).toBe(5);
expect(myNumber).toEqual(5);
上記のテストは両方ともパスします。の間に違いはありますか?
toBe()
と
toEqual()
は、数字を評価するときに使うのでしょうか?もしそうなら、どのような場合に一方を使い、他方を使わない方がいいのでしょうか?
どのように解決するのですか?
プリミティブ型(数値、ブーリアン、文字列など)の場合、以下のような違いはありません。
toBe
と
toEqual
には、どちらを使ってもかまいません。
5
,
true
または
"the cake is a lie"
.
との違いを理解するために
toBe
と
toEqual
のように、3つのオブジェクトを想像してみましょう。
var a = { bar: 'baz' },
b = { foo: a },
c = { foo: a };
厳密な比較を行うことで (
===
) の場合、あるものは "同じ" になります。
> b.foo.bar === c.foo.bar
true
> b.foo.bar === a.bar
true
> c.foo === b.foo
true
しかし、あるものは、たとえquot;equot;であっても、メモリ内の異なる場所に住むオブジェクトを表すため、quot;同じquot;ではないのである。
> b === c
false
ジャスミンの
toBe
マッチャーは厳密な等式比較のラッパーに過ぎません。
expect(c.foo).toBe(b.foo)
とは同じものです。
expect(c.foo === b.foo).toBe(true)
私の言葉を鵜呑みにせず、以下をご覧ください。 toBeのソースコード .
しかし
b
と
c
は機能的に等価なオブジェクトを表し、どちらも次のようになります。
{ foo: { bar: 'baz' } }
と言えるとしたら、素晴らしいことだと思いませんか?
b
と
c
は、同じオブジェクトを表現していなくても、等しいのでしょうか?
入る
toEqual
これは、quot;deep equality" をチェックします(つまり、オブジェクトを再帰的に検索して、キーの値が等価であるかどうかを判断します)。次のテストは両方ともパスします。
expect(b).not.toBe(c);
expect(b).toEqual(c);
これで、いくつかのことが明確になったかと思います。
関連
-
[解決済み] 期待される代入または関数呼び出し: 未使用式なし ReactJS
-
[解決済み】 Uncaught TypeError : undefined のプロパティ 'replace' を読み取れない In Grid
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み] event.preventDefault() vs. return false
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Vueがechartsのtooltipにクリックイベントを追加するケーススタディ
-
vue3.0プロジェクトのアーキテクチャを構築するための便利なツール
-
JavaScriptのクロージャの説明
-
vueにおけるv-forループオブジェクトのプロパティ
-
Vueでルートネスティングを実装する例
-
[解決済み] TypeError: $.ajax(...) is not a function?
-
[解決済み】エラー。Ionic使用中にモジュール '../lib/utils/unsupported.js' が見つかりませんでした。
-
フロントエンド null のプロパティ 'disabled' を読み取れない 問題が解決された
-
モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory, scandir 'D:\.... \node_modules
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?