2016-09-06 1 views
0

다음과 같은 서비스가 있습니다. 위의 사용하는 컨트롤러의재스민에서 콜백 메소드의 기능을 테스트하십시오.

InvService(...){ 
    this.getROItems = function(cb){ 
    $http.get('url').success(cb); 
    } 
} 

하나 : 재스민에서

var roItems = []; 
InvService.getROItems(function(res){ 
    roItems = res.lts.items; 
}); 

, 나는 roItems 응답의 값을 할당되었는지 테스트합니다. 이것을 어떻게 할 수 있습니까?

+0

콜백 대신 약속을 사용하도록 패턴을 변경하는 것이 좋습니다. like this.getROItems = function() {return $ http.get ('url'); }'및'InvService.getROItems.then (function (res) {roItems = res.lts.items;})'를 호출합니다. 약속을 사용하는 것은 AngularJS에서 꽤 표준 적입니다 (사용중인 것으로 보입니다). –

답변

1

서비스 및 컨트롤러에 대한 분리 된 테스트를 수행하는 것이 좋습니다. roItems이 할당되었는지 테스트하려면 컨트롤러를 테스트해야합니다. 그런 다음 컨트롤러 테스트와 관련이 없으므로 서비스를 조롱하고 원하는대로 되돌릴 수 있습니다. 다음과 같은 것이 필요합니다.

describe('my awesome test', function() { 

    it('my awesome test block',       
     inject(function(InvService, $controller) { 
       //This mocks your service with a fake implementation. 
       //Note that I mocked before the controller initialization. 
       spyOn(InvService, 'getROItems').and.callFake(function(cb){ 
        var resultFake = { 
         lts: { 
          items: "whatever you want" 
         } 
        } 
        cb(resultFake); 
       }); 
       //This initializes your controller and it will use the mocked 
       //implementation of your service 
       var myController = $controller("myControllerName"); 

       //Here we make the assertio 
       expect(myController.roItems).toBe("whatever you want"); 
     } 
) 
}); 
+0

여기에 약간의 맛을 더하는 것 : @PedroVaz가 여기서하고있는 것은 컨트롤러를 테스트 할 때 서비스 호출을 "조롱하는"것입니다. 따라서 컨트롤러의 서비스 호출 인 작업 단위 (UOW)가 테스트됩니다. '$ http.get'을 조롱하고'getROItems'가 올바르게 호출하도록하는 별도의 테스트를 해보십시오. '$ http.get()'이 작동하는지 테스트 할 필요는 없습니다. 저는 AngularJS 팀이 이미 그렇게했다고 생각합니다. :) –

+0

@MikeMcCaughan을 추가해 주셔서 감사합니다 :) –

+0

물론 답장을 편집하고 거기에 팝업하십시오. :) –

관련 문제