2013-10-24 4 views
17

Ich wiederhole etwas Code in meiner Spezifikationsdatei, die eine Schablone einspritzt und sie dann kompiliert. Ich habe diesen Code in eine Hilfsfunktion extrahiert, um die Dinge trocken zu halten. Ich glaube, das Problem besteht darin, zu beforeEach in einer Hilfsfunktion zu platzieren. Hier ist das Stück von meinem Code, den ich zu abstrakt versuchen in eine Funktion:Wie erstelle ich einen Helfer für Jasmine/Angular, um mehrere vorherEs zu kombinieren

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

Hier wird die Hilfsfunktion, die ich erstellt:

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

Und das ist jetzt der Ruf an die Hilfsfunktion :

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

Am Ende meiner Helferfunktion, sieht alles gut, aber wenn ich zu meinem it Block springen, alles ist nicht definiert. Kann ich mehrere beforeEach's extrahieren? Was ist der richtige Weg? Auch, wo ist der richtige Ort, um Jasmin Helfer Funktionen zu setzen und wie ist das gemacht?

Antwort

15

Sie können globale beforeEach() - Funktionen erstellen, indem Sie sie außerhalb des Kontextes einer bestimmten describe-Funktion schreiben. Sie sollten eine Klasse spec-helper.js mit diesen Funktionen erstellen und sie über Karma config laden.

Beachten Sie, dass die beforeEach-Funktionen vor jeder ausgeführten Funktion ausgeführt werden (da sie global sind).

Ich habe eine fiddle erstellt, um zu demonstrieren, aber der Schlüssel mit Karma ist, die Datei zur Konfiguration hinzuzufügen, damit sie vom Browser geladen wird.

Spec Helfer:

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

Dies löst nicht das Problem, wenn Sie nur wollen, um den Code für eine Teilmenge von Tests durchgeführt, wo die Tests in separaten Dateien . –

+1

Sie haben Recht. Dies läuft für alle Tests, unabhängig von ihrer Datei –

+3

Ich habe eine sehr ähnliche Situation in meinem Projekt. Ich habe meine globalen 'beforeEach'-Aufrufe innerhalb einer Funktion eingepackt und rufe diese Funktion am oberen Ende meines' describe'-Blocks für alle Testsuiten auf, die sie benötigen. –

Verwandte Themen