2013-08-13 1 views
1

내 컨트롤러는 http 요청을하는 서비스에 의존합니다. 컨트롤러 및 서비스 테스트에는 모두 동일한 데이터가있는 httpBackend가 필요합니다. 해결 방법에 대해 알고 있습니까?

+0

컨트롤러가 HTTP 요청을 직접 수행합니까, 아니면 서비스 만 수행합니까? –

+0

서비스는 HTTP 요청 만 수행합니다. – poiuytrez

+0

서비스가 HTTP 요청 만 수행하는 경우 왜 컨트롤러 테스트가'$ httpBackend'를 사용해야합니까? –

답변

0

난 당신의 코드는 다음과 같습니다 상상 : 위해

angular.module('MyApp', []) 
    .controller('MyCtrl', function($scope, MyService) { 
     $scope.doSomething = function() { 
      MyService.doSomething(); 
     }; 
    }) 
    .service('MyService', function($http) { 
     $http.get('some-url') 
      .success(function(response) { 
       // Handles the response 
      }); 
    }); 

단위 테스트 MyCtrl에 당신이 종속성을 조롱해야 $scopeMyService을. 그래서 테스트에서이 작업을 수행 할 수 있습니다

describe('MyCtrl', function() { 
    var MyServiceMock, 
     scope; 

    beforeEach(function() { 
     module('MyApp'); 

     // Creates a mock (spy) for MyService 
     MyServiceMock = jasmine.createSpyObj('MyService', ['doSomething']); 

     inject(function($provide) { 
      // Tells Angular to use MyServiceMock instead of MyService 
      $provide.value('MyService', MyServiceMock); 
     }); 

     inject(function($controller, $rootScope) { 
      scope = $rootScope.$new(); 
      $controller('MyCtrl', { $scope: scope }); 
     }); 
    }); 

    it('calls doSomething of MyService', function() { 
     $scope.doSomething(); 
     expect(MyServiceMock.doSomething).toHaveBeenCalled(); 
    }); 
}); 

당신이 MyService의 실제 인스턴스를 사용하지 않고도 MyCtrl을 테스트 할 수 있습니다 그 방법을.

$httpBackend 서비스를 사용하여 MyService에 대한 테스트 작성 방법을 알고 있다고 가정합니다. 여기서는 코드를 게시하지 않겠습니다.

+0

당신은 (적어도 나를 위해) 많이 추측 할 수 있습니다. $ httpBackend 테스트를 설명해 주시겠습니까? – boatcoder

+0

@ Mark0978 안녕하세요. '$ httpBackend' 서비스에서 [docs] (http://docs.angularjs.org/api/ngMock/service/$httpBackend)를 확인 했습니까? 거기에 당신이 그것을 더 잘 이해하는 데 도움이 될 몇 가지 코드 예제가 있습니다. –

+0

예, 두 시간 동안 그들과 함께했습니다. 내 서비스는 $ http를 사용하기 때문에 약속을 반환하고 테스트가 끝나기 전에 약속이 해결되지 않습니다. 나는 $ http 응답 해결을 볼 수 있지만 결코 내 서비스가 반환 약속. – boatcoder