Der Unterschied zwischen assert.equal und assert.deepEqual beim Testen von Javascript mit Mocha?


90

Ich verwende Mocha, um ein kleines Modul in meiner Express.js-Anwendung zu testen. In diesem Modul gibt eine meiner Funktionen ein Array zurück. Ich möchte testen, ob das Array für eine bestimmte Eingabe korrekt ist oder nicht. Ich mache das so:

suite('getWords', function(){
    test("getWords should return list of numbers", function() {
        var result = ['555', '867', '5309'];
        assert.equal(result, getWords('555-867-5309'));
    });
});

Wenn dies ausgeführt wird, wird der folgende Bestätigungsfehler angezeigt:

AssertionError: ["555","867","5309"] == ["555","867","5309"]

Wenn ich jedoch meinen Test in einen ändere assert.deepEqual, besteht der Test einwandfrei. Ich habe mich gefragt, ob es ein Fall von ==vs ist ===, aber ob ich eintrete

[1,2,3] === [1,2,3]

In der Befehlszeile von node.js erhalte ich immer noch false.

Warum vergleichen Arrays nicht wie andere Werte (z. B. 1 == 1)? und was ist der Unterschied zwischen assert.equal und assert.deepEqual?

Antworten:


155

Warum vergleichen Arrays nicht wie andere Werte (z. B. 1 == 1)?

Zahlen, Zeichenfolgen, Boolesche Werte nullund undefinedsind Werte und werden wie erwartet verglichen. 1 == 1, 'a' == 'a'Und so weiter. Der Unterschied zwischen ===und ==im Fall von Werten besteht darin, dass zuerst ==versucht wird, eine Typkonvertierung durchzuführen, weshalb, '1' == 1aber nicht '1' === 1 .

Arrays hingegen sind Objekte. ===und ==in diesem Fall nicht bedeuten, dass die Operanden semantisch gleich sind, sondern dass sie sich auf dasselbe Objekt beziehen .

Was ist der Unterschied zwischen assert.equal und assert.deepEqual?

assert.equalverhält sich wie oben erklärt. Es schlägt tatsächlich fehl, wenn die Argumente sind !=, wie Sie in der Quelle sehen können . Daher schlägt dies für Ihre Arrays von Zahlenzeichenfolgen fehl, da sie zwar im Wesentlichen gleichwertig sind, jedoch nicht dasselbe Objekt sind.

Eine tiefe (auch strukturelle) Gleichheit testet dagegen nicht, ob die Operanden dasselbe Objekt sind, sondern ob sie äquivalent sind. In gewissem Sinne könnte man sagen, dass Objekte gezwungen werden, verglichen zu werden, als wären sie Werte.

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!

4
Tolle Erklärung von deepEqual(); Nicht wirklich etwas, woran Sie im Vergleich denken, bis Sie tatsächlich darauf stoßen.
Brandonscript
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.