別のサービスに依存するAngularJSの単純なサービスをテストする際にいくつかの問題があります。
サービスは次のようになります。
serviceModule.factory('filtersService', ['$rootScope', 'urlService', function($rootScope, urlService){
return {
getFilters: function(){
if(urlService.getPathName() == "test")
{
return "something";
}
}]);
最初は、サービスを作成する代わりに window.location.pathname を使用しようとしましたが、それをモックできる方法が間違っているように思えました。したがって、urlService を作成しました。これは基本的に、ウィンドウ オブジェクトの単純なラッパーです。
次に、次のようなfiltersServiceTestがあります。
describe('filtersService test', function(){
var filtersService, urlServiceMock;
beforeEach(module('App.services'));
beforeEach(function(){
urlServiceMock = {
getPathName: function(){
return "";
}
};
module(function($provide){
$provide.value('urlService', urlServiceMock);
});
});
it('Should return something if url is test', inject(function(filtersService){
urlServiceMock = {
getPathName: function(){
return "test";
}
};
expect(filtersService.getFilters()).not.toBe("something");
}));
});
しかし、これはうまくいかないようです。実際に実行する前に urlServiceMock をオーバーロードすることはできません。getPathName が "test" を返すように ' ' をそれぞれ変更できbeforeEach
ますが、URL が test と等しくないシナリオをテストすることはできません。