내 컨트롤러는 http 요청을하는 서비스에 의존합니다. 컨트롤러 및 서비스 테스트에는 모두 동일한 데이터가있는 httpBackend가 필요합니다. 해결 방법에 대해 알고 있습니까?
답변
난 당신의 코드는 다음과 같습니다 상상 : 위해
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
에 당신이 종속성을 조롱해야 $scope
및 MyService
을. 그래서 테스트에서이 작업을 수행 할 수 있습니다
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
에 대한 테스트 작성 방법을 알고 있다고 가정합니다. 여기서는 코드를 게시하지 않겠습니다.
당신은 (적어도 나를 위해) 많이 추측 할 수 있습니다. $ httpBackend 테스트를 설명해 주시겠습니까? – boatcoder
@ Mark0978 안녕하세요. '$ httpBackend' 서비스에서 [docs] (http://docs.angularjs.org/api/ngMock/service/$httpBackend)를 확인 했습니까? 거기에 당신이 그것을 더 잘 이해하는 데 도움이 될 몇 가지 코드 예제가 있습니다. –
예, 두 시간 동안 그들과 함께했습니다. 내 서비스는 $ http를 사용하기 때문에 약속을 반환하고 테스트가 끝나기 전에 약속이 해결되지 않습니다. 나는 $ http 응답 해결을 볼 수 있지만 결코 내 서비스가 반환 약속. – boatcoder
컨트롤러가 HTTP 요청을 직접 수행합니까, 아니면 서비스 만 수행합니까? –
서비스는 HTTP 요청 만 수행합니다. – poiuytrez
서비스가 HTTP 요청 만 수행하는 경우 왜 컨트롤러 테스트가'$ httpBackend'를 사용해야합니까? –