2013-02-20 7 views
5

Ich bin neu im Komponententesten und versuche, Dinge zu verstehen. Ich gebe mein Bestes, um diesem Tutorial zu folgen: http://www.yearofmoo.com/2013/01/full-spectrum-testing-with-angularjs-and-testacular.html#testing-filters. In meiner AngularJS App habe ich einen Filter, den ich testen muss. Ich habe Node, Testacular und Jasmine eingerichtet und läuft richtig. Der Filter, den ich versuche zu testen, ist ziemlich einfach:Testen der Filterpräsenz in einem Winkel

myApp.filter('bill_ship', function() { 
    return function (userData) { 
     var output = "---"; 
     switch (userData) { 
      case "0": 
       output = "Billing"; 
       break; 
      case "1": 
       output = "Shipping"; 
       break; 
     } 
     return output; 
    } 
}); 

Ich dachte, ich hatte meinen Test richtig eingerichtet, aber es schlägt konsequent fehl.

describe("Unit Testing: Filters - ", function() { 
    beforeEach(angular.mock.module('prismApp', ['bill_ship'])); 

    //BillShip Filter 
    it('should have a bill-ship filter: ', inject(function($filter){ 
     expect($filter('bill_ship')).not.toEqual(null); 
    })); 
}); 

Es mit dieser Meldung fehl: Fehler: Argument 'fn' ist keine Funktion, bekam Zeichenfolge aus bill_ship.

Also ... wo mache ich das falsch?

+0

Ist 'bill_ship' auch der Name des Moduls, in dem sich der 'bill_ship'-Filter befindet? Wenn sich der Filter im Modul 'prismApp' befindet, sollten Sie '[' bill_ship ']' nicht als zweiten Parameter an' angle.mock.module 'übergeben. –

+0

Die Angular-App befindet sich in einer separaten Datei vom Filter: var myApp = angular.module ("prismApp", []); Der Filter wird genau wie gezeigt deklariert. Wenn ich den zweiten Parameter weglasse, wimmert es bei mir über einen unbekannten Provider: Fehler: Unbekannter Provider: bill_shipFilterProvider <- bill_shipFilter – MBielski

+0

Kannst du es mit 'beforeEach (Modul ('prismApp')) versuchen;' stattdessen? Dies ist, wie wir das vorher haben, damit unsere richtig laufenden Filtertests arbeiten - das 'es (...' Funktion sieht richtig aus. –

Antwort

1

Ok, das, warum ich sollte nie Code ohne caffine ...

Es hilft sehr, wenn Sie die Dateien setzen, die Sie in der Konfigurationsdatei testen möchten. Junge, ich fühle mich dumm.

+0

Btw. Sie sollten wählen Sie Ihre eigene Lösung, um die Antwort. – mlunoe

+0

Danke für das zeigen, dass. – MBielski

24

Wenn sich jemand anderes wundert (ich verbringe etwas Zeit, bevor ich herausfand), dachte ich, dass @MBielski 's Weg der Injektion von Filtern ein wenig verwirrend ist, aber deaffinely tut die Arbeit! Ich fand jedoch, dass dies ein guter Weg ist, Filter in die Testumgebung von Jasmin-Einheiten zu injizieren, um sie zu testen.

Hier ist die Filterdefinition:

angular.module('prismApp.filters', []) 

    .filter('billShip', function() { 
    return function (userData) { 
     // define filter 
     ... 
    } 
    }); 

Und der Test:

describe("Unit Testing: Filters - ", function() { 
    var billShip; 

    // load the module 
    beforeEach(module('prismApp.filters')); 

    // load filter function into variable 
    beforeEach(inject(function ($filter) { 
    billShip = $filter('billShip'); 
    })); 

    // test billShip filter 
    it('should have a bill-ship filter: ', function() { 
    // test away! 
    expect(billShip).not.toEqual(null); 
    expect(billShip("0")).toEqual("Billing"); 
    ... 
    }); 
}); 

Hope this jemand anderes hilft.

+0

Hey, das ist ziemlich glatt! Vielen Dank für die Veröffentlichung! – MBielski

+0

Geben Sie ein upvote wenn du denkst? – mlunoe