2017-11-14 5 views
0

다른 함수 내부의 함수가 호출되었는지 어떻게 테스트 할 수 있습니까? 소스 코드를 변경할 수 없으므로이 코드를 그대로 테스트해야합니다.다른 함수 내부의 함수가 호출되었는지 어떻게 테스트 할 수 있습니까?

어떻게하면됩니까?

function B(){ console.log('function b'); } 

function A(){ 
    B(); 
} 

재스민 시험 :

it('should check function B in function A was called', function() { 
    spyOn(window, 'B'); 
    A(); 
    expect(B).toHaveBeenCalled(); 
}); 
+0

내가 대답을 추가 할하지만 난이 대부분의 의견 생각합니다. 나에게 이것은 코드 냄새 다. 유닛 테스트는 개별 유닛 (모듈, 함수, 클래스)을 나머지 프로그램과 분리하여 테스트합니다. 기본적으로 입력을 받으면 출력을 받는다는 것을 테스트합니다. 중첩 호출을 이동하고 컴포지션과 테스트 된 컴포지션 도구를 대신 사용하는 것이 좋습니다. '파이프 '같은 것. 'pipe (a, b) (inputToA)'는 mocks 나 스파이가없는 3 개의 완전히 테스트 된 함수를 제공합니다. 이것은 많은 사람들이 생각하는 의견이 아니므로 소금 한 알씩 가져 가십시오. – ktilcu

답변

0

스파이

재스민 스파이라는 테스트 이중 기능을 가지고

여기 내 코드입니다. 스파이는 어떤 함수를 스텁 (stub) 할 수 있고 그 함수에 대한 호출과 모든 인수를 추적 할 수 있습니다. 스파이는 설명에있는 또는 정의 된 블록에만 존재하며 각 사양 후에는 이 제거됩니다. 간첩과 함께 을 상호 작용하기위한 특수 matcher가 있습니다. 이 구문은 Jasmine 2.0에서 변경되었습니다. 스파이가 호출되면 toHaveBeenCalled matcher가 true를 반환합니다. 인수 목록 이 스파이에 대한 기록 된 호출 중 하나와 일치하면 toHaveBeenCalledWith matcher는 true를 반환합니다.

describe("A spy", function() { 
    var foo, bar = null; 

    beforeEach(function() { 
    foo = { 
     setBar: function(value) { 
     bar = value; 
     } 
    }; 

    spyOn(foo, 'setBar'); 

    foo.setBar(123); 
    foo.setBar(456, 'another param'); 
    }); 

    it("tracks that the spy was called", function() { 
    expect(foo.setBar).toHaveBeenCalled(); 
    }); 

    it("tracks all the arguments of its calls", function() { 
    expect(foo.setBar).toHaveBeenCalledWith(123); 
    expect(foo.setBar).toHaveBeenCalledWith(456, 'another param'); 
    }); 

    it("stops all execution on a function", function() { 
    expect(bar).toBeNull(); 
    }); 
}); 
관련 문제