2013-10-30 9 views
6

Ich möchte einfache konstante Werte wie Namen, E-Mails usw. für meine Jasmin-Unit-Tests verwenden.Wie stelle ich wiederverwendbare Beispieldatenwerte zu meinen angularjs/jasmine Unit-Tests zur Verfügung

Eine ähnliche Frage wurde hier gefragt: AngularJS + Karma: reuse a mock service when unit testing directives or controllers

In C# ich eine statische Klasse schaffen würde kleine Schnipsel von Scheindaten zu halten. Ich kann diese Werte dann während meiner Unit-Tests verwenden, wie folgt aus:

static class SampleData 
{ 
    public const string Guid = "0e3ae555-9fc7-4b89-9ea4-a8b63097c50a"; 
    public const string Password = "3Qr}b7_N$yZ6"; 

    public const string InvalidGuid = "[invalid-guid]"; 
    public const string InvalidPassword = "[invalid-password]"; 
} 

Ich möchte den gleichen Komfort haben, bei der Verwendung von Karma/Jasmin meine AngularJS App testen.

Ich weiß, dass ich ein constant Objekt gegen meine Winkel app definieren kann ich tun dies bereits für Konstanten ich in der realen Code verwenden, wie folgt aus:

myApp.constant('config', {apiUrl:'http://localhost:8082'}) 

ich eine andere Konstante wie dies nur hinzufügen, könnte aber nur enthaltenden Probe Datenwerte für die Verwendung in meiner Unit-Tests, wie folgt aus:

myApp.constant('sampleData', {email: '[email protected]'}) 

ich konnte dann nur das Schein konstante Objekt in meinen Tests injizieren und aus gehe ich, wie diese

describe 'A sample unit test', -> 
    beforeEach -> module 'myApp' 
    beforeEach inject ($injector) -> 
     @sampleData = $injector.get 'sampleData' 
     email = @sampleData.email 
     # etc ... 

Aber das scheint mir ein bisschen fischig. Ich möchte nicht, dass mein Produktionscode Beispieldaten enthält, die nur von meinen Komponententests benötigt werden.

Wie würden Sie Ihre Winkel-/Jasmin-Komponententests bequem mit wiederverwendbaren Datenwerten versehen?

Dank

+0

Sie im Rahmen Mock-Objekte von bedeuten, dass man Sie Dienstleistungen zu testen, oder sind Sie Sprechen Sie über Testwerte, die Sie in Ihren Komponententests verwenden können? – Ben

+0

Nur einfache, wiederverwendbare Testwerte für den Einsatz in Komponententests. Ich habe die Frage geklärt. – biofractal

+0

ist das ähnlich? http://stackoverflow.com/questions/16563967/angularjs-karma-reuse-a-mock-service-when-unit-testing-directives-or-controll Sie können die Datei karma.conf.js bearbeiten, um zusätzliche Dateien hinzuzufügen, wie Mocks, und laden sie in Tests –

Antwort

9

Es gibt zwei Möglichkeiten, dies zu tun:

  • Spion auf Funktionsaufrufe und gefälschte Werte zurückgeben.
  • erstellen Mock-Klassen (und möglicherweise Schein Daten sie zu initialisieren) und sie laden, wo immer Sie

Die erste brauchen, ist in Ordnung, wenn man nur zu fälschen ein paar Anrufe. Das für eine ganze Klasse zu tun ist nicht nachhaltig.

Nehmen wir zum Beispiel an, Sie haben einen Dienst, der einige spezielle URLs erstellt. Wenn eine der Methoden auf absUrl hängt, können Sie fälschen, indem Sie im $location Objekt auf der Methode Spionage:

describe('example') function() { 
    beforeEach(inject(function() { 
     spyOn($location, 'absUrl').andCallFake(function (p) { 
      return 'http://localhost/app/index.html#/chickenurl'; 
     }); 
    })); 
it('should return the url http://www.chicken.org') ... { 
    // starting situation 
    // run the function 
    // asserts 
} 

die wir nun sagen, dass Sie einen Settings Dienst haben, die Daten wie Sprache, Thema, spezielle Wege kapselt, Hintergrundfarbe, Schriftart ..., die mit einem Remote-Aufruf an einen Server initialisiert wird. Testing-Dienste, die auf Settings angewiesen sind, werden schmerzhaft sein. Sie müssen jedes Mal eine große Komponente mit SpyOn verspotten. Wenn Sie 10 Dienste haben ... wollen Sie nicht die SpyOn-Funktionen in allen kopieren.

ServiceA verwendet Settings Service:

describe('ServiceA', function() { 
var settings, serviceA; 

beforeEach(module('myapp.mocks.settings')); // mock settings 
beforeEach(module('myapp.services.serviceA')); // load the service being tested 

beforeEach(inject(function (_serviceA_, _settings_) { 
    serviceA = _serviceA_; 
    settings = _settings_; 
})); 

Behälter für diesen Test-Suite, werden alle Anrufe an die Settings Dienst wird von der Mock-behandelt werden, die die gleiche Schnittstelle wie die reale, aber gibt Füllwerten . Beachten Sie, dass Sie diesen Dienst überall laden können.

(Wenn aus irgendeinem Grund, Sie die reale Implementierung verwenden benötigt, können Sie die reale Umsetzung vor dem Mock laden und verwenden spyOn für diesen speziellen Fall den Anruf an die tatsächliche Umsetzung zu delegieren.)

Normalerweise Sie platzieren das Mock-Modul außerhalb des App-Ordners. Ich habe einen test Ordner mit den Komponententests, e2e Tests und einem lib Ordner mit der angular-mocks.js Datei. Ich stelle meine Spinner auch hin. Sagen Karma Dateien, die Sie für die Tests benötigen:

files: [ 
     'app/lib/jquery/jquery-1.9.1.js', 
     'test/lib/jasmine-jquery.js', 
     'app/lib/angular/angular.js', 
     'app/lib/angular/angular-*.js', 
     'test/lib/angular/angular-mocks.js', 
     'test/lib/myapp/*.js', /* this is mine */ 
     'app/js/**/*.js', 
     'test/unit/**/*.js' 
    ], 

Die Datei tests/lib/myapp.mocks.settings.js wie jedes andere Modul aussieht:

(function() { 
"use strict"; 

var m = angular.module('myapp.mocks.settings', []); 

m.service('settings', function() { ... }) 
}) 

Zweites Problem (optional): Sie schnell die Dummy-Werte ändern möchten. Im Beispiel ruft der Einstellungsdienst ein Objekt vom Server ab, wenn es zum ersten Mal instanziiert wird. dann hat der Dienst Getter für alle Felder. Dies ist eine Art Proxy für den Server: Anstatt eine Anforderung zu senden, wenn Sie einen Wert benötigen, holen Sie einige davon und speichern Sie sie lokal. In meiner Anwendung ändern sich die Einstellungen auf dem Server während der Laufzeit nicht.

Etwas wie:

1. fetch http://example.org/api/settings 
2. var localSettings = fetchedSettings; 
3 getFieldA: function() { return localSettings.fieldA; } 

Go und den globalen Namensraum verschmutzen. Ich habe eine Datei settings.data.js mit einem Inhalt wie:

var SETTINGS_RESPONSE = { fieldA: 42 }; 

das Mock-Dienst verwendet diese globale Variable in der Fabrik zu instanziiert localSettings

Verwandte Themen