Мокко говорит, что assert.equal([0, 0], [0, 0]) терпит неудачу. Почему?

#javascript #mocha.js

#javascript #mocha.js

Вопрос:

Я тестирую с mocha, какой-то модуль с определенным поведением. Например, я хочу, чтобы

 var module = new Module()
module.getSomething()
  

возвращает [0,0] . Итак, я попытался это протестировать:

 var assert = require('assert')
  , Module = require('../lib/module')
describe('Module()', function () {
    describe('#getSomething()', function () {
        it('should return [0,0] by default', function () {
            var map = new Module()
            assert.equal([0, 0], map.getCenter()[0])
        })
    })
})
  

Тест завершается с ошибкой. После нескольких попыток… Я попадаю в этот тест:

 var assert = require('assert')
describe('[0,0]', function () {
    it('should be equals to [0,0]', function () {
        assert.equal([0, 0], [0, 0])
    })
})
  

Мммм, я думаю, что у меня есть некоторый пробел в javascript. Ну, .. мне нужно создать модуль, который в какой-то момент возвращает небольшие объекты, такие как {x:0,y:0} . Может кто-нибудь объяснить мне, как протестировать этот материал? Этот способ работает, … правильно?

 describe('#getCenter()', function () {
    it('should return [0,0] by default', function () {
        var map = new Map()
        assert.equal(0, map.getCenter().x)
        assert.equal(0, map.getCenter().y)
    })
})
  

Ответ №1:

Это просто потому, что в JavaScript сравнение объектов выполняется по ссылке, а не путем глубокой проверки на равенство.

Примеры :

 [] == [] // false
[1] == [1] // false
({} === {}) // false
  

Вместо этого вы можете использовать assert.deepEqual , который будет делать то, что вы ожидаете.

(на всякий случай, если вам интересно, я вставил круглые скобки {} , чтобы сделать их выражением, вместо того, чтобы делать первый {} блок блоком ( {}; === {} таким образом, код будет недействительным))