Testen injiziert service, der eine Konstruktor-Funktion
Sagen, dass ich einem service wie diesem, wo ein Auto bekommt ein Motor service injiziert, das eine Konstruktor-Funktion:
angular.module('car', ['engine']).factory('carCreator', function( engine ) {
var carCreator = function( settings ) {
var engineInstance = engine( settings );
engineInstance.setMiles( settings.engine.miles );
return {
brand: settings.brand;
engine: engineInstance;
}
};
return carCreator;
});
Wie Teste ich die beiden Zeilen in der Initialisierung der Logik:
var engineInstance = engine( settings );
engineInstance.setMiles( settings.engine.miles )
1: engine
heißt mit settings
2: engineInstance.setMiles
heißt mit settings.engine.miles
Dies ist, was ich gerade mache, aber mit kein Glück:
describe('initialization', function() {
var carCreator;
var settings = {
brand: 'Ford',
engine: {
miles: 12000
}
};
var mockEngineInstance = {
setMiles: function() {}
};
window.mockEngineCreator = function() {
return mockEngineInstance;
}
beforeEach(module('car', function($provide) {
$provide.value('engine', mockEngineCreator );
}));
beforeEach(inject(function(_carCreator_) {
carCreator = _carCreator_;
}));
it('should init text object correctly on initialization', function() {
spyOn(window, 'monkEngineCreator');
spyOn(mockEngineInstance, 'setMiles');
carCreator( settings );
expect(window.mockEngineCreator).toHaveBeenCalledWith( settings );
expect(mockEngineInstance.setMiles).toHaveBeenCalledWith( settings.engine.miles );
});
});
aber dieser test fehlschlägt, sagen, dass window.mockEngineCreator
nie genannt wurde. Es scheint, dass $bereitstellen erstellt eine neue Kopie der Funktion übergeben, anstatt halten eine Referenz auf diese. Also, weiß jemand, wie man das setup ein test, testen können das richtig?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Grund dafür ist, dass beim ausführen von spyOn(window, 'monkEngineCreator'), der spy ist auf die Fenster, nicht die injiziert Wert, der Winkel verwendet für dependency injection.
Sowas sollte funktionieren: (code ungetestet)
and.callFake
statt.