3 回答
TA贡献1834条经验 获得超8个赞
您可以使用来将模拟注入服务中$provide。
如果您具有以下具有依赖项的服务,该服务具有名为getSomething的方法:
angular.module('myModule', [])
.factory('myService', function (myDependency) {
return {
useDependency: function () {
return myDependency.getSomething();
}
};
});
您可以按如下方式注入myDependency的模拟版本:
describe('Service: myService', function () {
var mockDependency;
beforeEach(module('myModule'));
beforeEach(function () {
mockDependency = {
getSomething: function () {
return 'mockReturnValue';
}
};
module(function ($provide) {
$provide.value('myDependency', mockDependency);
});
});
it('should return value from mock dependency', inject(function (myService) {
expect(myService.useDependency()).toBe('mockReturnValue');
}));
});
请注意,由于有调用,$provide.value因此实际上不需要在任何地方显式注入myDependency。它发生在注入myService的过程中。在此处设置嘲讽依赖时,它可能同样容易成为间谍。
TA贡献1946条经验 获得超3个赞
从我的角度来看,无需自己模拟服务。只需在服务上模拟功能。这样,您就可以像在整个应用程序中一样对您的真实服务进行有角度的注入。然后,使用Jasmine的spyOn功能根据需要在服务上模拟功能。
现在,如果服务本身是一个函数,而不是可以使用的对象spyOn,则还有另一种解决方法。我需要执行此操作,然后发现一些对我来说非常有效的方法。
TA贡献1845条经验 获得超8个赞
除了John Galambos的回答:如果您只想模拟服务的特定方法,则可以这样做:
describe('Service: myService', function () {
var mockDependency;
beforeEach(module('myModule'));
beforeEach(module(function ($provide, myDependencyProvider) {
// Get an instance of the real service, then modify specific functions
mockDependency = myDependencyProvider.$get();
mockDependency.getSomething = function() { return 'mockReturnValue'; };
$provide.value('myDependency', mockDependency);
});
it('should return value from mock dependency', inject(function (myService) {
expect(myService.useDependency()).toBe('mockReturnValue');
}));
});
添加回答
举报