我一直在尝试测试一项服务无济于事,并希望获得一些帮助。这是我的情况:
我有一个服务,看起来像这样
myModule.factory('myService', ['$rootScope', '$routeParams', '$location', function($rootScope, $routeParams, $location) {
var mySvc = {
params: {}
}
// Listen to route changes.
$rootScope.$on('$routeUpdate', mySvc.updateHandler);
// Update @params when route changes
mySvc.updateHandler = function(){ ... };
...
...
return mySvc;
}]);
我想在将服务注入(inject)测试之前模拟注入(inject)
'myService'
的服务,以便可以在下面测试初始化代码 var mySvc = {
params: {}
}
// Listen to route changes.
$rootScope.$on('$routeUpdate', mySvc.updateHandler);
我正在使用Jasmine进行测试和模拟。这是我现在想出的
describe('myService', function(){
var rootScope, target;
beforeEach(function(){
rootScope = jasmine.createSpyObj('rootScope', ['$on']);
module('myModule');
angular.module('Mocks', []).service('$rootScope', rootScope );
inject(function(myService){
target = myService;
});
});
it('should be defined', function(){
expect(target).toBeDefined();
});
it('should have an empty list of params', function(){
expect(target.params).toEqual({});
});
it('should have called rootScope.$on', function(){
expect(rootScope.$on).toHaveBeenCalled();
});
});
但是,这不起作用。我的rootscope模拟并未取代原始版本,并且依赖注入(inject)文档使我比其他任何事情都更加困惑。
请帮忙
最佳答案
我会监视实际的$ rootScope而不是尝试注入(inject)自己的自定义对象。
var target, rootScope;
beforeEach(inject(function($rootScope) {
rootScope = $rootScope;
// Mock everything here
spyOn(rootScope, "$on")
}));
beforeEach(inject(function(myService) {
target = myService;
}));
it('should have called rootScope.$on', function(){
expect(rootScope.$on).toHaveBeenCalled();
});
我已经在CoffeScript中进行了测试,但是上面的代码仍然可以使用。