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?
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
@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