2017-09-06 1 views
0

의 배열 나는이 유사한 코드를 및 getter.모카, 배열 및 범위

const Foo = require('./../foo.js'), 
    source = [[1, 2, 3], [4, 5, 6]], 
    chai = require('chai'), 
    expect = chai.expect; 

describe('Foo',() => { 
    describe('bar',() => { 
     it('expect to modify the array',() => { 
      let foo = new Foo(source); 

      foo.bar(); 

      expect(foo.a).to.deep.equal([[1, [1], 3], [4, [1], 6]]); 
     }); 
    }); 

    describe('get',() => { 
     it('expect to return the array',() => { 
      let foo = new Foo(source); 
      expect(foo.get()).to.deep.equal([1, 2, 3]); 
     }); 
    }); 
}); 

있는 내가 처음에 source 변수를 선언하고 새로운 Foo 각 테스트를 구축하는 데 사용

는 지금은 모카로, 단위 테스트를 작성.

그러나, 결과는 ... bar 테스트는 get 시험에 foo의 속성을 수정하는 것이 : 아무것도 변경되지 않습니다 모카 시험 대신 화살표 기능의 익명 함수를 사용

Foo 
    bar 
     ✓ expect to modify the array 
    get 
     1) expect to return the array 


    1 passing (19ms) 
    1 failing 

    1) Foo get expect to return the array: 

     AssertionError: expected [ [ 1, [ 1 ], 3 ], [ 4, [ 1 ], 6 ] ] to deeply equal [ 1, 2, 3 ] 
     + expected - actual 

     [ 
     - [ 
     - 1 
     - [ 
     -  1 
     - ] 
     - 3 
     - ] 
     - [ 
     - 4 
     - [ 
     -  1 
     - ] 
     - 6 
     - ] 
     + 1 
     + 2 
     + 3 
     ] 

     at Proxy.assertEqual (node_modules/chai/lib/chai/core/assertions.js:1020:19) 
     at Proxy.methodWrapper (node_modules/chai/lib/chai/utils/addMethod.js:57:25) 
     at Context.it (test/foo.js:20:30) 

, splice을 사용하여 소스를 값으로 복사 할 수도 있습니다.

내가 무엇을 놓쳤습니까? 그것은 분명히 두 배열의 동일한 참조를 모두 foo의 속성에 기인 한 것이 분명합니다. 그러나 더 중요한 것은 내가 어떻게 만들 수 있는지를 알아낼 수 없습니다. foo을 분리하십시오.

+0

@Jonasw 실제 코드, 검사가 실패 : t는 케이 있도록 만들어진다 – DrakaSAN

답변

1

this.a = a.slice()은 얕은 사본 만 사용하기 때문입니다. 그러나 a은 중첩 된 배열이므로 중첩 된 배열의 내용을 변경하면 this.asource 모두 볼 수 있습니다.

당신은 변경 될 수 있습니다 :

this.a = a.slice(); 

에 : 당신이 초기화 된 것을 source에 비교되지 않기 때문에 두 번째 테스트는, 어떤 방법을 변경해야 할 것

this.a = (function deepSlice(a) { 
    return Array.isArray(a) ? a.map(deepSlice) : a; 
})(a); 

참고. 그래서 변경 :

expect(foo.get()).to.deep.equal([1, 2, 3]); 

에 :

expect(foo.get()).to.deep.equal([[1, 2, 3], [4, 5, 6]]); 
+0

단순한 'a.map 시도했다 ((b) = > {돌아 가기 b.slice()})', 그러나 그것은 효과가 없었고, 나는 잘못된 방향으로 가고 있다고 생각 했었습니다. 더 깊은 곳에 있어야했습니다. – DrakaSAN

+0

이렇게하면 문제가 해결 되었습니까? – trincot

+1

예, 모바일 앱이 초록색 표시를 보내지 않았습니다. :) – DrakaSAN