2017-10-13 11 views
0

Jest를 사용하여 유닛 테스트를하는 동안 방해가되는 오류가있었습니다.Jest가 객체를 간첩 조사하지 못했습니다.

문제 :는 내부 객체 메소드

사건에 액세스하지 않는 농담 : 우리가 직접 B 메서드를 호출 할 경우, A와 b() 방법과 lol 개체있다 농담 우리가 lol.b()라고 부르면 실패합니다.

누군가 이미이 문제가 발생 했습니까? 더 나은 해결 방법이 있습니까?

코드 :

describe('Jest bug',() => {  
    it('Jest fail',() => { 
     const lol = (() => { 
      const a =() => { 
       console.log("console a"); 
       b(); 
      }; 
      const b =() => { 
       console.log("console b"); 
      }; 
      return { 
       a, 
       b 
      }; 
     })(); 

     const spy = jest.spyOn(lol, 'b'); 

     lol.a(); 

     expect(spy).toHaveBeenCalled() 
    }); 

    it('Jest success',() => { 
     const lol = (() => { 
      const a =() => { 
       console.log("console OK a"); 
       lol.b(); 
      }; 
      const b =() => { 
       console.log("console OK b"); 
      }; 
      return { 
       a, 
       b 
      }; 
     })(); 

     const spy = jest.spyOn(lol, 'b'); 

     lol.a(); 

     expect(spy).toHaveBeenCalled() 
    }); 

}); 

답변

0

농담 spyOn 내부 스파이 기능 아 파크 객체 메소드를 대체 - 스파이 기능이 이의를 '연결'되어있는 특성 포인트를 반대하는 것이 원래의 기능을 포장하지 않습니다. 직접 농담 스파이 완전히 인식하지

let b = function() { 
    ... 
}; 

let lol = { 
    b: b 
}; 

spyOn(lol, 'b'); 
//Jest internally does something like this 
lol.b = function jestSpyFunction() { 
    ... 
}; 

을 지금 b()를 호출 그래서 경우 : 당신이 lol.b 방법에 스파이를 설정하면 농담이 같은 (물론 코드 아래에 거대한 단순화하고 일반적인 생각을 보여 그냥) 수행 이 경우 jestSpyFunction이 호출되지 않기 때문에 lol.b()을 사용하는 경우에만 호출됩니다.
내 opintion에서 lol의 두 번째 구현은 정확하며 코드를 테스트 할 수 있도록하려면이 방법을 사용해야합니다. 게다가 ab 함수를 'private'(익명 함수 내에서) 함수로 정의하므로 바깥 쪽 범위 (Jest 스파이조차도)에서 액세스 할 수 없으며 정확하고 의도 된 동작을합니다.