2013-08-11 8 views
11

Ich möchte einige meiner HTTP-Anfrage durch und verspotten sie nicht in meinem Unit-Test, aber wenn ich versuche, passThrough() -Methode, einen Fehler der fehlenden Methode aufrufen wird geworfen:

Weiß jemand, wie ich es bitte reparieren kann?

Es ist mein Code:

'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

Wie in [Dokumentation] (http://docs.angularjs.org/api/ngMock.$httpBackend): * Während der Unit-Tests wollen wir unsere Unit-Tests schnell laufen und haben keine externen Abhängigkeiten Daher möchten wir keine XHR- oder JSONP-Anfragen an einen echten Server * senden. Der $ httpBackend-Dienst, der in Komponententests verwendet wird, kann nicht übergeben werden. Das vom End-to-End-Test verwendete $ httpBackend kann dies jedoch. –

+6

Das macht Testing-Richtlinien mit externen Templates schwieriger als nötig, finden Sie nicht? – SimplGy

Antwort

4

Wenn Sie Ihre Backend während der Entwicklung verspotten, installieren Sie einfach angular-mocks in Ihrem Haupt-HTML-Datei, fügen Sie es als eine Abhängigkeit in der Anwendung bis (angular.module('myApp', ['ngMockE2E'])) und dann die Anfragen verspotten du brauchst.

Zum Beispiel;

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

Seien Sie aber vorsichtig, dass die ngMockE2E Zugabe benötigen Sie Ihre Routen im Falle einzurichten Sie dies durch AngularJS Routing tun.

Beispiel;

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

Sie sollten angular-mocks nicht als Abhängigkeit zu Ihrer App hinzufügen, sondern in Ihrer karma.conf verwenden. Dann gib auf dem beforeEach (Modul (...)) 'ngMockE2E' ein. – gonzofish

+4

+1 gonzofish. Füge einfach beforeEach ein (function() {module ('ngMockE2E');}); in deinem Test. Sie müssen Ihre App nicht mit Testsubstanzen verschmutzen. – benek