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

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

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

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

72 голоса | спросил mshell_lauren 5 12012vEurope/Moscow11bEurope/MoscowMon, 05 Nov 2012 06:37:14 +0400 2012, 06:37:14

1 ответ


0
  

Почему массивы не сравниваются так, как другие значения (например, 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!
ответил numbers1311407 5 12012vEurope/Moscow11bEurope/MoscowMon, 05 Nov 2012 08:32:33 +0400 2012, 08:32:33

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132