Подтвердить что ты не робот

Разница между assert.equal и assert.deepEqual в тестировании Javascript с помощью Mocha?

Я использую Mocha для тестирования небольшого модуля в приложении Express.js. В этом модуле одна из моих функций возвращает массив. Я хочу проверить правильность массива для данного ввода. Я делаю так вот так:

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, тест проходит отлично. Мне было интересно, был ли это случай == vs ===, но если я введу

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

в командной строке node.js, я все равно получаю false.

Почему массивы не сравнивают то, как это делают другие значения (например, 1 == 1)? и в чем разница между assert.equal и assert.deepEqual? ​​

4b9b3361

Ответ 1

Почему массивы не сравнивают то, как это делают другие значения (например, 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!