2012-11-05 2 views
54

저는 Express.js 응용 프로그램에서 작은 모듈을 테스트하기 위해 Mocha를 사용하고 있습니다. 이 모듈에서 함수 중 하나가 배열을 반환합니다. 배열이 주어진 입력에 대해 정확한지 테스트하려고합니다. 나는이 같은 일을 오전 : 내가 assert.deepEqual에 내 테스트를 변경할 때모카와 자바 테스트에서 assert.equal과 assert.deepEqual의 차이점은 무엇입니까?

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

그러나, 테스트가 잘 전달이 실행되면

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

, 나는 다음과 같은 주장의 오류가 발생합니다. 이 ==의 경우 === 대했다 궁금 해서요,하지만 난 Node.js를 명령 줄에

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

을 입력하면, 나는 아직도 거짓 얻을.

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

답변

109

Why do arrays not compare the way other values do (e.g. 1==1)

숫자, 문자열, 부울

, nullundefined 값이며, 예상대로 비교된다. 1 == 1, 'a' == 'a' 등입니다. 값의 경우 =====의 차이점은 '1' == 1이지만 이 아니고'1' === 1이 아닌 이유는 ==이 먼저 유형 변환을 시도한다는 것입니다.

반면에 배열은 객체입니다. 이 경우 =====은 피연산자가 의미 상 동일하지만, 이 동일한 개체을 참조 함을 의미하지 않습니다.

what is the difference between assert.equal and assert.deepEqual?

assert.equal은 위에서 설명한대로 동작합니다. 인수가 != 인 경우 실제로는 실패합니다. in the source을 볼 수 있습니다. 따라서 숫자 문자열 배열에 대해서는 기본적으로 동일하지만 동일한 객체가 아니기 때문에 실패합니다.

심도 (일명 ​​구조적) 평등은 피연산자가 같은 개체인지 테스트하지 않으며 동등한 결과를 나타냅니다. 어떤면에서 볼 때 개체가 값인 것처럼 개체를 비교해야한다고 말할 수 있습니다.

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! 
+2

'deepEqual()'; 당신이 실제로 그것을 가로 질러 올 때까지 당신이 비교에서 생각하는 어떤 것이 아닙니다. – brandonscript

관련 문제