2013-07-09 13 views
69

Sto tentando di inserire il codice del controller di test all'interno di un modulo che accetta altri moduli come dipendenze, ma non sono stato in grado di capire come prenderli in giro correttamente.Mocking Dipendenze dei moduli angolari nei test delle unità Jasmine

Sto utilizzando il framework Jasmine e sto eseguendo i miei test con Karma (Testacular).

Codice Modulo

var app = angular.module('events', ['af.widgets', 'angular-table']); 

app.controller('eventsCtrl', function([dependencies]){ 
    $scope.events = []; 
    ... 
}); 

Codice Spec

describe('events module', function(){ 
    var $scope, 
     ctrl; 

    beforeEach(function(){ 
     angular.mock.module('af.widgets', []); 
     angular.mock.module('angular-table', []); 
     module('events', ['af.widgets', 'angular-table']); 
    }); 

    beforeEach(inject(function($rootScope, $controller){ 
     $scope = $rootScope.new(); 
     ctrl = $controller('NameCtrl', { 
      $scope: $scope, 
     }); 
    })); 

    it('should have an empty events array', function(){ 
     expect($scope.events).toBe([]); 
    }) 
}); 

L'errore che sto ottenendo è Karma è "no af.widgets modulo", quindi ovviamente non sto beffardo le dipendenze del modulo a destra. Qualche suggerimento?

+1

$ scope = $ rootScope.new(); dovrebbe essere $ scope = $ rootScope. $ new(); (forse per la nostra versione) –

risposta

60

Se si vuole prendere in giro un modulo che dichiara uno o più servizi che ho ve utilizzato questo codice:

beforeEach(function(){ 
    module('moduleToMock'); 
    module(function ($provide) { 
     $provide.value('yourService', serviceMock); 
    }); 
}); 

Questo è utile se il servizio si vuole prendere in giro è anche un servizio che si desidera unit test (in un altro gelsomino descrivere). La soluzione proposta da fscof va bene ma non è possibile creare un test unitario per il modulo angular-table.

+4

Questo è il modo giusto. Perché spesso non vuoi usare una simulazione per tutti i test. Anche qui: http://stackoverflow.com/a/18756347/1105860 –

+0

Secondato. Questo è più corretto. – dgtc

+0

E se voglio mettere 'serviceMock' in un altro file, senza dichiarare variabili globali? –

44

Ecco cosa ho capito:

non stava caricando i moduli qualsiasi 'angolare-tavolo' nel mio file karma.conf.js, da qui l'errore. Inizialmente questo era intenzionale perché volevo testare il modulo 'eventi' senza il modulo della tabella reale.

sono stato in grado di prendere in giro facilmente il modulo 'angolare-table' con la creazione di un nuovo file nella mia cartella test chiamato 'prende in giro/angolare table.js' e ha aggiunto il seguente codice:

/deride/angolari-table.js

'use-strict'; 
angular.module('angular-table', []); 

ho aggiunte questo file per il mio file karma.conf.js, insieme con il modulo i veri 'eventi' ho voluto mettere alla prova:

karma.conf.js

... 
files = [ 
    JASMINE, 
    JASMINE_ADAPTER, 
    'scripts/libs/angular.js', 
    'scripts/libs/angular-mocks.js', 
    'scripts/events.js', // this is the real module. 
    'scripts/mocks/*.js', //loads all custom mocks. 
    'scripts/specs/*.spec.js' // loads my spec file. 
] 
... 

Infine nel mio file spec, sono stato in grado di aggiungere entrambi i moduli chiamando separatamente in un blocco beforeeach:

spec/events.spec.js

beforeEach(function(){ 
    module('angular-table'); 
    module('events'); 
}); 

I ho avuto l'idea di strutturare i miei file in questo modo da this post

+2

Non stai prendendo in giro il modulo 'angular-table' chiamando angular.module? Penso che tu voglia chiamare il modulo, dato che l'angolosa-matta lo attribuisce alla portata globale? Ad ogni velocità, grazie perché questo mi ha aiutato a far funzionare le mie specifiche. – phillyslick

+0

"Sono stato in grado di prendere facilmente in giro il modulo 'angular-table' creando un nuovo file nella mia cartella di test chiamato 'mocks/angular-table.js' e aggiunto il seguente codice: /mocks/angular-table.js " –

+0

@fscof Il link sta dando 404. – Lucio

3

Recentemente ho rilasciato ngImprovedTesting che dovrebbe rendere più semplice il test di simulazione in AngularJS.

Nel tuo caso basta usare il seguente nel test Jasmine:

beforeEach(ModuleBuilder.forModule('events').serviceWithMocks('eventsCtrl').build()); 

Per ulteriori informazioni su ngImprovedTesting check-out la sua introduttivo post del blog: http://blog.jdriven.com/2014/07/ng-improved-testing-mock-testing-for-angularjs-made-easy/

Problemi correlati