2016-10-05 7 views
1

JS 단위 테스트에서 시작하여 Jasmine 스파이와 함께 의미있는 테스트를 만드는 방법에 대해 머리를 터는 데 어려움을 겪고 있습니다. 나는이 getTotal에 내 전화는 하드 사양 내부 코딩과 같은 유용한 검사 방법 볼 수 없습니다 내가 예제로 만들어 테스트 위의 발췌를 사용Jasmine spyOn 및 스파이를 일반적으로 사용하는 방법

it('should take an array of shopping items', function() { 
    spyOn(checkObj, 'getTotal'); 
    checkObj.getTotal([1, 2, 3]); 
    expect(checkObj.getTotal).toHaveBeenCalledWith(jasmine.any(Array)); 
}); 

. 그러나 동시에 전달 된 매개 변수가 배열이고 다른 형식이 아닌지 확인하고자합니다 ... 확실한 하드 코딩이 어떻게 든 잘못되었습니다. 누군가가 내가 생각하는 방법에 대한 지침의 비트를 제공 할 수

은/

+0

난 당신이 여기에 잘못된 문제를보고있다 생각합니다. 질문은 당신이 테스트하려고하는 것이 무엇입니까? 지금 가지고있는 코드는 쓸모가 없습니다. 배열로 호출하고 다음 줄에 배열로 호출했는지 확인하십시오. 그것은 말 그대로 테스트를 테스트하고 있습니다. 검증하는 것은 유용한 일이 아닙니다. 여기에서 확인하고 싶은 것이 더 좋은 질문입니까? 'getTotal'이 배열만을 받아들이는지 확인하고 싶다면 아마 다른 것들을 호출해야하고 어떤 종류의 오류가 필요할 것입니다. – vlaz

+0

의견을 보내 주셔서 감사합니다 vlaz, 당신이 말한, 그것은 잘못된 일을하고있는 것 같아요 toHaveBeenCalledWith 인수를 테스트하고 그것을 단순히 메서드의 출력을 테스트하는 것이 좋습니다. 나는 또한 당신의 아이디어를 풀어 줄 것입니다. 제가 확인하고 싶었던 것은 배열이 인수로 전달되고 있지만 테스트 물건을 다 써 버리려하는지 확실하지 않다는 것입니다. – user1806692

답변

0

글쎄, 스파이 조금 다른 시나리오에 대한 유용한 테스트 이러한 유형의 시나리오를 접근. 많은 것은 당신 자신이 단위 테스트의 범위를 정의하는 방법에 달려 있습니다. 당신은 최소한의 가능한 단위 (즉, 방법)을 수행하면 다음과 같은 상상 할 수 있습니다 :

var x = function() { } 
x.prototype.f1 = function() { 
     //do something 
     }, 
x.prototype.f2 = function(){ 
      // do something else 
      this.f1(); 
     } 

을 이제 F2에 대한 단위 테스트 당신이 F1 내부의 작동 방식에 관심이 없습니다. 그래서, 당신은에 스파이합니다

var a = new x(); 
a.f1 = jasmine.createSpy("spy-on-f1"); 
expect(a.f1).not.toHaveBeenCalled(); 
a.f2(); 
expect(a.f1).toHaveBeenCalled(); 

예를 들어, AngularJS와 응용 프로그램, 스파이와 나는 종종 모의 전체 서비스, 그냥 테스트 알고리즘을 분리 할 수 ​​있습니다.

보너스로, 당신은 실제로이 같은 가짜 기능을 실제 전화를 대체 할 수

a.f1 = jasmine.createSpy("fake-spy").and.callFake(function(){ 
    // do something predictible or return global variable that can be set externaly 
});