2017-01-23 1 views
0

zu gehen Ich habe einige Probleme, eine Fabrik zu verspotten, die zu einem meiner Module gehört. Die Fabrik Ich mag würde verspotten hat zwei Abhängigkeiten:Mock ein AngularJS-Modul, um zu einem anderen

Factory-Klasse:

angular.module('serviceapp') 
.factory('claims.service', ['applicationSettings', 'localStorageService', function (applicationSettings, localStorageService) { 
    //Factory code here 
}]); 

Prüfklasse:

//Instantiate some values 
var mockAppSettings = {}; 
var mockStorageService = {}; 
var $factory; //Will hold my factory 

//Targeting my module for mocking 
beforeEach(angular.mock.module('serviceapp')); 

//Providing some values for the dependencies of my module 
beforeEach(module('serviceapp', function ($provide) { 
    $provide.value('applicationSettings', mockAppSettings); 
    $provide.value('localStorageService', mockStorageService); 
})); 

//Problems start here 
beforeEach(inject(function ($injector) { 
    $factory = $injector.get('claims.service'); 
})); 

ich eine Fehlermeldung

Failed to instantiate module serviceapp due to: Failed to instantiate module accountModule due to: Module 'accountModule' is not available! bekommen

Bei der Untersuchung sehe ich, dass accountModule als eine Abhängigkeit für das serviceApp Modul aufgeführt ist.

App.module Klasse:

angular.module('serviceapp', [accountModule]) 

aber ich einige Probleme mit diesem Modul spöttisch zu serviceApp passieren. Ich habe versucht, das accountModule auf die gleiche Weise zu verspotten, wie ich die serviceapp am Anfang verspottete, aber das bringt immer noch dieselbe Fehlermeldung mit sich. Wie kann ich mich verspotten und ein Modul an ein anderes weitergeben?

Antwort

1

sollte nicht wörtlich gelesen werden. Es verspottet kein Modul. Es ist dasselbe wie module('serviceapp') und wird in modularen Umgebungen verwendet, in denen module reserviert ist.

Also, alles, was

beforeEach(angular.mock.module('serviceapp')); 
beforeEach(module('serviceapp', ...)); 

tut, ist serviceapp zweimal geladen (tut nicht weh, aber hilft auch nicht).

beforeAll(() => { 
    angular.module('accountModule', []) 
}); 

Das Problem bei diesem Ansatz ist, dass selbst wenn sie definiert wurde, wird es bis zum Ende des Testlaufs außer Kraft gesetzt werden:

Module 'accountModule' is not available! Um zu vermeiden, sollte es (wieder) definiert sein. Wenn in anderen Tests Real accountModule verwendet werden muss, ist dies nicht möglich.

Die passende Lösung für ähnliche Design-Fragen (dies gilt auch für Abhängigkeiten, die in Tests nicht erwünscht sind, zB Router-Module) ist

angular.module('serviceapp', ['accountModule']); 

angular.module('serviceapp.internal', []) 
.factory('claims.service',...); 

Hier serviceapp als flache Wrapper dient serviceapp.internal, während die letzteren kann sicher getestet werden. Wenn serviceapp das Top-Level-Modul ist, das zum Bootstrapping verwendet wird, weist dies darauf hin, dass die Anwendung nicht ausreichend modularisiert wurde, was den Test beeinträchtigt.

+0

Ahhh ich sehe! Vielen Dank für den (wirklich tollen) Einblick in diese Sache! Ich werde es versuchen – Novastorm

+1

Beachten Sie auch, dass $ provide.value redundant ist. Das Gleiche kann mit dem Objektargument https://docs.angularjs.org/api/ngMock/function/angular.mock.module#usage getan werden. – estus

Verwandte Themen