2013-10-24 1 views
17

continuo a ripetere qualche codice nel mio file spec che inietta un modello e poi compila esso. Ho estratto questo codice in una funzione di supporto per mantenere le cose ASCIUTTE. Credo che il problema sia nel cercare di inserire in beforeEach in una funzione di supporto. Ecco il pezzo del mio codice che sto cercando di astrarre in una funzione:Come faccio a creare un aiutante per Jasmine/angolare di combinare più di beforeeach

beforeEach(module('app/views/header.html')); 

    beforeEach(inject(function($templateCache, $compile, $rootScope) { 
    template = $templateCache.get('app/views/header.html'); 
    $templateCache.put('views/header.html', template); 
    var directive = angular.element('<clinical-header></clinical-header>'); 
    element = $compile(directive)($rootScope); 
    $rootScope.$digest(); 
    })); 

Qui è la funzione di supporto che ho creato:

var setupTemplate = function(templateName, element) { 
    beforeEach(module('app/views/' + templateName)); 
    beforeEach(inject(function($templateCache, $compile, $rootScope) { 
    var template = $templateCache.get('app/views/' + templateName); 
    $templateCache.put('views/' + templateName, template); 
    var directive = angular.element(element); 
    element = $compile(directive)($rootScope); 
    $rootScope.$digest(); 
    })); 

E ora questa è la chiamata alla funzione di supporto :

setupTemplate('header.html', '<clinical-header></clinical-header>'); 

alla fine della mia funzione di supporto, tutto sembra a posto, ma quando faccio un salto al mio it blocco, tutto è indefinito. Posso estrarre più beforeEach? Qual è il modo giusto per farlo? Inoltre, dov'è il posto giusto dove mettere le funzioni di aiuto del gelsomino e come è fatto?

risposta

15

È possibile creare beforeeach globale() funzioni scrivendole di fuori del contesto di una specifica funzione di descrivere. Si dovrebbe creare una classe spec-helper.js con queste funzioni e caricarlo attraverso Karma config.

Nota che le funzioni beforeeach venga eseguita prima di qualsiasi funzione che si utilizza (in quanto sono globali).

Ho creato un fiddle per dimostrare, tuttavia la chiave con Karma è di aggiungere il file alla configurazione in modo che venga caricato dal browser.

Spec Helper:

var myGlobal; 
beforeEach(function() { 
    // This will run before any it function. 
    // Resetting a global state so the change in this function is testable 
    myGlobal = 10 
}); 

Test Suite:

describe('first suite', function(){ 
    it('is a test', function(){ 
    expect(myGlobal).toBe(10); 
    // Reset the value to show that beforeEach is executed for each it function 
    myGlobal = 20; 
    expect(myGlobal).toBe(20); 
    }); 

    it('is another test', function($location){ 
    expect(myGlobal).toBe(10); 
    myGlobal = 20; 
    expect(myGlobal).toBe(20); 
    }); 
}); 
+1

Questo non risolve il problema se si desidera eseguire solo il codice per un sottoinsieme di test, dove i test sono in file separati . –

+1

Hai ragione. Questo funziona per tutti i test, indipendentemente dal loro file. –

+3

Ho una situazione molto simile nel mio progetto. Ho avvolto le mie chiamate globali 'beforeEach' all'interno di una funzione, e ho chiamato quella funzione nella parte superiore del mio blocco' describe' per qualsiasi suite di test che ne ha bisogno. –