我在AngularJS中测试一个简单的服务有som问题,这取决于另一个服务。
该服务看起来有点像这样:
serviceModule.factory('filtersService', ['$rootScope', 'urlService', function($rootScope, urlService){
return {
getFilters: function(){
if(urlService.getPathName() == "test")
{
return "something";
}
}]);
一开始我只是尝试使用window.location.pathname而不是创建服务,但它似乎是错误的方式来模拟它。因此我创建了urlService,它基本上是一个围绕window-object的简单包装器。
然后我的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实际运行之前重载它。我可以更改'beforeEach
',因此getPathName返回“test”,但是我无法测试url不等于test的情况。
答案 0 :(得分:0)
您可以监视测试套件中的服务以更改行为:
spyOn(yourService, 'methodName');
关于如何实施间谍的jsFiddle有一个很好的例子:http://jsfiddle.net/robinroestenburg/aDwva/
这应该让你让它正常工作。