Mocha를 사용한 Javascript 테스트에서 assert.equal과 assert.deepEqual의 차이점은 무엇입니까?


94

내 Express.js 응용 프로그램에서 작은 모듈을 테스트하기 위해 Mocha를 사용하고 있습니다. 이 모듈에서 내 함수 중 하나가 배열을 반환합니다. 주어진 입력에 대해 배열이 올바른지 테스트하고 싶습니다. 나는 이렇게하고있다 :

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 명령 줄에 여전히 거짓이 표시됩니다.

배열이 다른 값 (예 :)과 비교하지 않는 이유는 무엇 1 == 1입니까? assert.equal과 assert.deepEqual의 차이점은 무엇입니까?

답변:


161

배열이 다른 값과 비교하지 않는 이유 (예 : 1 == 1)

숫자, 문자열, 논리 값은 null, 및 undefined가치, 그리고 예상대로 비교된다. 1 == 1, 'a' == 'a'등. 차이 =====값의 경우는 인 ==이유 인, 제 1 유형 변환을 수행하려고 시도 '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!

4
에 대한 훌륭한 설명 deepEqual(); 실제로 그것을 발견하기 전까지는 비교에서 생각하는 것이 아닙니다.
brandonscript
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.