2013-08-11 6 views
11

내 http 요청의 일부를 통과시키고 단위 테스트에서 모의하지 않으려하지만 passThrough() 메소드를 호출하려고하면 메소드가 누락 된 오류가 발생합니다. 슬로우됩니다 :

"TypeError: Object # has no method 'passThrough'".

이 사람이 내가 제발 해결할 수있는 방법을 알고 있나요

?

내 코드입니다 :

'use strict'; 

describe('Controller: MainCtrl', function() { 

    // load the controller's module 
    beforeEach(module('w00App')); 

    var scope, MainCtrl, $httpBackend; 

    // Initialize the controller and a mock scope 
    beforeEach(inject(function(_$httpBackend_, $rootScope, $controller) { 
     $httpBackend = _$httpBackend_; 
     $httpBackend.expectGET('http://api.some.com/testdata.json').passThrough(); 


     scope = $rootScope.$new(); 
     MainCtrl = $controller('MainCtrl', { 
      $scope: scope 
     }); 
    })); 
}); 
+3

으로는 [문서] 설명 (http://docs.angularjs.org/api/ngMock.$httpBackend) : * 단위 테스트하는 동안, 우리는 우리의 단위 테스트를 빠르게 실행할 및 외부 의존성이 없습니다 따라서 XHR 또는 JSONP 요청을 실제 서버에 보내지 않으려합니다 *. 단위 테스트에서 사용 된 $ httpBackend 서비스는 통과 할 수 없습니다. 하지만 end-to-end 테스트에서 사용되는 $ httpBackend는 가능합니다. –

+6

이것은 외부 템플릿을 사용하여 테스트 지시문을 필요 이상으로 어렵게 만듭니다. 그렇지 않습니까? – SimplGy

답변

4

당신이 요청을 조롱 한 후, 당신의 주 HTML 파일에 angular-mocks를 설치, 개발하는 동안 백엔드를 조롱 응용 프로그램 (angular.module('myApp', ['ngMockE2E']))에 종속성으로 그것을 추가하고 싶은 경우 너 필요해.

예 :

angular.module('myApp') 
    .controller('MainCtrl', function ($scope, $httpBackend, $http) { 
    $httpBackend.whenGET('test').respond(200, {message: "Hello world"}); 
    $http.get('test').then(function(response){ 
     $scope.message = response.message //Hello world 
    }) 
    }); 

는 ngMockE2E를 추가하는 것은 당신이 AngularJS와 라우팅을 통해 그렇게 할 경우에 대비하여 경로를 설정하는 데 필요한 것입니다,하지만주의하십시오.

예;

angular.module('myApp', ['ngMockE2E']) 
    .config(function ($routeProvider) { 
    $routeProvider 
     .when('/', { 
     templateUrl: 'views/main.html', 
     controller: 'MainCtrl' 
     }) 
     .otherwise({ 
     redirectTo: '/' 
     }); 
    }) 
    .run(function($httpBackend){ 
    $httpBackend.whenGET('views/main.html').passThrough(); 
    }) 
+11

당신은 당신의 앱에 종속물로서 각 모크를 추가하지 말고 karma.conf에서 활용하십시오. 그런 다음 beforeEach (모듈 (...))에서 'ngMockE2E'를 전달합니다. – gonzofish

+4

+1 gonzofish. 그냥 beforeEach (function() {module ('ngMockE2E');});를 추가하십시오. 당신의 시험에서. 테스트를 통해 앱을 오염시킬 필요가 없습니다. – benek

관련 문제