2013-08-11 6 views
11

Vorrei passare alcune delle mie richieste http e non deriderle nel mio test di unità, ma quando provo a chiamare il metodo passThrough(), un errore di metodo mancante è lanciato:

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

Qualcuno sa come posso risolvere il problema per favore?

V'è il mio codice:

'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

Come spiegato in [documentazione] (http://docs.angularjs.org/api/ngMock.$httpBackend): * Durante il test di unità, vogliamo che i nostri test di unità per eseguire in modo rapido e non hanno dipendenze esterne quindi non vogliamo inviare richieste XHR o JSONP a un vero server *. Il servizio $ httpBackend utilizzato nei test unitari non può passare. Il $ httpBackend utilizzato dal test end-to-end può, tuttavia. –

+6

Ciò rende le direttive di test con i modelli esterni più difficili del necessario, non credi? – SimplGy

risposta

4

Se si vuole prendere in giro il vostro back-end durante lo sviluppo, è sufficiente installare angular-mocks nel file HTML principale, aggiungerlo come una dipendenza nell'applicazione (angular.module('myApp', ['ngMockE2E'])) e poi deridere le richieste devi.

Ad esempio;

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

essere cauti, però, che l'aggiunta del ngMockE2E richiede di impostare i percorsi nel caso in cui lo si fa attraverso AngularJS routing.

Esempio;

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

Non dovresti aggiungere angock-mocks come dipendenza alla tua app, ma usarla nel tuo karma.conf. Quindi su beforeEach (module (...)) passa in 'ngMockE2E'. – gonzofish

+4

+1 gonzofish. Basta aggiungere beforeEach (function() {module ('ngMockE2E');}); nel tuo test. Non è necessario inquinare la tua app con materiale di prova. – benek