2013-08-11 14 views
11

Chciałbym przekazać część mojego żądania http poprzez, a nie kpić z nich w moim teście jednostki, ale kiedy próbuję wywołać metodę passThrough(), błąd braku metody jest wyrzucane:

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

Czy ktoś wie, jak mogę to naprawić?

Jest to mój kod:

'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

Jak wyjaśniono w [dokumentacja] (http://docs.angularjs.org/api/ngMock.$httpBackend): * Podczas testów jednostkowych, chcemy nasze testy jednostkowe, aby szybko i nie ma zależności zewnętrzne więc nie chcemy wysyłać żądań XHR lub JSONP do prawdziwego serwera *. Usługa $ httpBackend używana w testach jednostkowych nie może przejść. Można jednak użyć $ httpBackend używanego przez test end-to-end. –

+6

To sprawia, że ​​testowanie dyrektyw z szablonami zewnętrznymi jest trudniejsze niż to konieczne, nie sądzisz? – SimplGy

Odpowiedz

4

Jeśli chcesz szydzić swój backend podczas rozwoju, wystarczy zainstalować angular-mocks w głównym pliku html, dodać go jako zależność w aplikacji (angular.module('myApp', ['ngMockE2E'])) a następnie mock żądań musisz.

Na przykład;

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 
    }) 
    }); 

Uważaj jednak, że dodanie ngMockE2E będzie wymagać, aby skonfigurować trasy w przypadku to zrobić poprzez angularjs routingu.

Przykład;

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

Nie należy dodawać makiet kątowych jako zależności od aplikacji, ale wykorzystywać je w pliku karma.conf. Następnie na beforeEach (moduł (...)) przekazuj w 'ngMockE2E'. – gonzofish

+4

+1 gonzofish. Po prostu dodaj beforeEach (function() {module ('ngMockE2E');}); w twoim teście. Nie musisz zanieczyszczać swojej aplikacji materiałami testowymi. – benek

Powiązane problemy