0

Wir schreiben eine Reihe von Komponententests für eine Angular-Anwendung mit vielen Diensten. Es ist bequem gefälschte Service-Implementierungen zur Verfügung zu stellen, die in der Regel nichts zu tun, in die App-Modul angeschlossen werden, zum Beispiel:Jasmine & Angular: Einen Dienst in einen Service-Mock einfügen

'use strict'; 

describe('ServiceUnderTest', function() { 

    beforeEach(module('app', FakeServiceA, FakeServiceB)); 

    ... 

} 

// Fake service implementations (global functions): 

function FakeServiceA($provide) { 
    $provide.value(
     'ServiceA' 
     { foo: function() {} } 
    ); 
} 

function FakeServiceB($provide) { 
    $provide.value(
     'ServiceB' 
     { bar: function() {} } 
    ); 
} 

Nun, wenn ich sich eigentlich will etwas tun, um statt nichts, zum Beispiel, ein Versprechen abzulehnen, traf ich das Problem, eine Abhängigkeit zu injizieren. Was ich will, ist:

function FakeServiceA($provide, $q) { 
    $provide.value(
     'ServiceA' 
     { foo: function() { return $q.reject('Nope!'); } } 
    ); 
} 

Aber es scheint unmöglich zu sein $q auf diese Weise zu injizieren. Gibt es einen anderen Weg, wie dies bei der Registrierung eines Moduls erreicht werden kann?

Antwort

1

$ q kann nicht auf diese Weise injiziert werden

function FakeServiceA($provide, $q) { ... 

da die angegebenen Abhängigkeiten von Anbieter Injektor injiziert werden, wie here beschrieben (die Tatsache, dass $provide dort verwendet werden kann, einen Hinweis auf das macht), während Serviceinstanzen ($ q) müssen vom Instanzinjektor injiziert werden. Offensichtlich kann es $q nicht injizieren, weil es zu diesem Zeitpunkt nicht von $qProvider instanziiert wurde.

Es hat so etwas sein:

function FakeServiceA($provide) { 
    $provide.factory('ServiceA', function ($q) { 
     return { foo: function() { return $q.reject('Nope!'); } } 
    }); 
} 
+0

Es tatsächlich funktioniert, aber es ist eine Art verletzt die Singletonmuster Dienste sollen einzuhalten. Aber für Unit-Tests ist das natürlich egal, da sie bei jedem Test neu erstellt werden. – yktoo

+0

@yktoo Hier passiert nichts wirklich Unheimliches oder Hacky. Tatsächlich ruft "$ provide.value" unter der Haube '$ provide.factory' mit leerer Factory-Funktion auf und' $ provide.factory' definiert einen Singleton-Service. – estus

Verwandte Themen