2013-07-11 5 views
0

jasmine을 사용하여 몇 가지 기본 테스트를 시도하고 있습니다. 내가 외부 라이브러리 &을 사용하고자하는 것은 spy/mock 메소드에서 라이브러리 객체 (d3)를 호출하고 적절한 메소드가 d3에서 호출되는지 확인하는 것입니다. 개체에 호출되고 '선택' 외부 라이브러리에서 jasmine 테스트

 var d3Spy = jasmine.createSpyObj('d3', ['select']); 
     spyOn(window, 'd3').andReturn(d3Spy); 
     expect(d3Spy.select).toHaveBeenCalled(); 

, 나는이 오류가 발생합니다.

TypeError: Object function() { 
spyObj.wasCalled = true; 
spyObj.callCount++; 
var args = jasmine.util.argsToArray(arguments); 
spyObj.mostRecentCall.object = this; 
spyObj.mostRecentCall.args = args; 
spyObj.argsForCall.push(args); 
spyObj.calls.push({object: this, args: args}); 
return spyObj.plan.apply(this, arguments); 
} has no method 'select' 

내가 뭘 잘못하고 있니? 코드에서

답변

4

실패는 당신이 d3()를 호출 할 때 다음과 같은

spyOn(window, 'd3').andReturn(d3Spy); 

이 줄은 스파이를 돌려 줘야합니다. 따라서 d3 객체는 호출 할 때 {select: jasmine.createSpy()}을 반환하는 함수로 바뀝니다. 하지만 D3 사용하는 것은 그래서 솔루션`d3.select 'Btw는

spyOn(d3, 'select') 

스파이 그냥 d3() 원인 selectd3

의 정적 멤버를 호출하지 않습니다. 무거운 사슬을 사용하는 D3 같은 libs의 문제는 모의하기가 어렵다는 것입니다. 따라서 예에서 select 스파이는 d3 Selections 객체에 맞는 객체를 반환해야합니다. 때때로 모든 것을 조롱하지 않는 것이 더 쉬울 수도 있습니다.

+0

당신은 방금 내가 가진 모든 문제를 지적했습니다. 체인화 된 메서드 호출로 인해 상황이 더욱 복잡 해짐에 따라 제안한 솔루션에서 되돌아갔습니다. 지금은 모든 메소드 호출을 감시하는 것을 멈추었 고 중요한 메소드 호출을 간첩하고 간단한 메소드 호출 만 호출했습니다. – Andy

관련 문제