Wie füge ich beim Testen einer Angular-Fabrik (mit Karma + Jasmine) eine Stub-Abhängigkeit in die zu testende Fabrik ein?
Hier ist meine Fabrik:
mod = angular.module('myFactoryMod', []);
mod.factory('myFactory', [
'$log', 'oneOfMyOtherServices', function($log, svc) {
return makeSomethingThatDoesSomethingWithTheseDependencies($log, svc);
}
]);
oneOfMyOtherServices
wird benötigt, wenn meine Fabrik instanziiert wird.
Hier ist mein Test:
it('can get an instance of my factory', function() {
var oneOfMyOtherServicesStub;
angular.mock.module('myFactoryMod');
oneOfMyOtherServicesStub = {
someVariable: 1
};
//****How do I get my stub in my target? ****
angular.mock.inject(['myFactory', function(target) {
expect(target).toBeDefined();
}
]);
})
NB Ich weiß, $controller
dass dies für Controller möglich ist, aber ich sehe kein Äquivalent für Fabriken.
quelle
var theFactory; beforeEach(inject(function(myFactory) { theFactory = myFactory; } )));
DanntheFactory
in Ihrem Test verwenden.Der Kommentar von @bentsai ist tatsächlich sehr hilfreich für das Testen von Diensten. Der Vollständigkeit halber füge ich ein Beispiel hinzu.
Hier ist ein Test,
jasmine
der ungefähr das tut, wonach Sie suchen. Hinweis: Dies erfordert dieangular-mocks
Aufnahme (dies bietet Funktionen wiemodule
undinject
).describe('app: myApp', function() { beforeEach(module('myApp')); var $controller; beforeEach(inject(function(_$controller_) { $controller = _$controller_; })); // Factory of interest is called MyFactory describe('factory: MyFactory', function() { var factory = null; beforeEach(inject(function(MyFactory) { factory = MyFactory; })) it('Should define methods', function() { expect(factory.beAwesome).toBeDefined() expect(factory.beAwesome).toEqual(jasmine.any(Function)) }); }); });
Dies ist ein Beispiel dafür, wie das Modul und die zugehörige Factory-Definition aussehen könnten:
var app = angular.module('myApp', []); app.factory('MyFactory', function() { var factory = {}; factory.beAwesome = function() { return 'Awesome!'; } return factory; });
In diesem Fall ist es klar, dass die Verwendung von
inject()
es Ihnen ermöglicht, Abhängigkeiten einzuziehen, wie Sie es in Ihrer normalen Winkelanwendung erwarten würden - und als solche Anforderungen aufzubauen, um das Testen von Dingen zu unterstützen, die auf ihnen beruhen.quelle