[解決済み] MochaでJavascriptをテストする際のassert.equalとassert.deepEqualの違い?
質問
私は Express.js アプリケーションの小さなモジュールをテストするために Mocha を使用しています。このモジュールでは、私の関数の 1 つが配列を返します。私は与えられた入力に対して配列が正しいかどうかをテストしたい。私はこのように行っています。
suite('getWords', function(){
test("getWords should return list of numbers", function() {
var result = ['555', '867', '5309'];
assert.equal(result, getWords('555-867-5309'));
});
});
これを実行すると、以下のようなアサーションエラーが発生します。
AssertionError: ["555","867","5309"] == ["555","867","5309"]
しかし、テストを
assert.deepEqual
に変更すると、テストは問題なく通過します。もしやと思ったのですが、これは
==
対して
===
と入力しても
[1,2,3] === [1,2,3]
をnode.jsのコマンドラインに入力しても、まだfalseが表示されます。
なぜ配列は他の値と同じように比較しないのでしょうか(例えば
1 == 1
のように)、またassert.equalとassert.deepEqualの違いは何ですか?
どのように解決するのですか?
なぜ配列は他の値と同じように比較できないのですか (例: 1==1)
数字、文字列、ブーリアン
null
そして
undefined
は値であり、期待通りに比較される。
1 == 1
,
'a' == 'a'
といった具合になります。 の違いは
===
と
==
の場合、値の場合は
==
は最初に型変換を行おうとするからである。
'1' == 1
が
ではなく
'1' === 1
.
一方、配列はオブジェクトです。
===
と
==
はオペランドが意味的に等しいことを意味するのではなく、この場合
は同じオブジェクト
.
assert.equalとassert.deepEqualの違いは何ですか?
assert.equal
は上で説明したように動作します。 実際に失敗するのは、引数が
!=
の場合は失敗します。
のように、ソースに
. このように、数値文字列の配列は本質的に同等ですが、同じオブジェクトではないので、失敗します。
一方、深い(別名、構造的)等値性は、オペランドが同じオブジェクトであるかどうかをテストするのではなく、むしろそれらが等価であることをテストします。 ある意味、オブジェクトが値であるかのように比較することを強制すると言えるでしょう。
var a = [1,2,3]
var b = a // As a and b both refer to the same object
a == b // this is true
a === b // and this is also true
a = [1,2,3] // here a and b have equivalent contents, but do not
b = [1,2,3] // refer to the same Array object.
a == b // Thus this is false.
assert.deepEqual(a, b) // However this passes, as while a and b are not the
// same object, they are still arrays containing 1, 2, 3
assert.deepEqual(1, 1) // Also passes when given equal values
var X = function() {}
a = new X
b = new X
a == b // false, not the same object
assert.deepEqual(a, b) // pass, both are unadorned X objects
b.foo = 'bar'
assert.deepEqual(a, b) // fail!
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] JavaScriptで現在のURLを取得する?
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] Bowerとnpmの違いは何ですか?
-
[解決済み] JavaScriptで、ある文字列が別の文字列の中に出現するすべてのインデックスを見つけるにはどうすればよいですか?
-
[解決済み] jQueryのバージョン1、バージョン2、バージョン3の違いは何ですか?[クローズド]
-
[解決済み] これは純関数ですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] チェックボックスが選択されているかどうかを確認するjQuery
-
[解決済み] なぜJavaScriptでは!{}[true]がtrueに評価されるのですか?
-
[解決済み] javascriptで2つの数値を連結する方法は?
-
[解決済み] bootstrap のポップオーバーがすべての要素の上に表示されない
-
[解決済み] Chart.jsを使ってドーナツチャートの中にテキストを追加するには?
-
[解決済み] javascript の関数から `undefined` と `null` のどちらを返すのが良いのでしょうか?
-
[解決済み] 兄弟ノードを選択する方法はありますか?
-
[解決済み] JSXとLoadshを使用して、ある要素をn回繰り返す方法
-
[解決済み] TypeScriptプロジェクトで既存のC#クラス定義を再利用する方法
-
[解決済み] JavaScriptデータフォーマット/プリティプリンタ