我写了一个AngularJS服务,我想对其进行单元测试。
angular.module('myServiceProvider', ['fooServiceProvider', 'barServiceProvider']). factory('myService', function ($http, fooService, barService) { this.something = function() { // Do something with the injected services }; return this; });
我的app.js文件已注册:
angular .module('myApp', ['fooServiceProvider','barServiceProvider','myServiceProvider'] )
我可以测试DI是否像这样工作:
describe("Using the DI framework", function() { beforeEach(module('fooServiceProvider')); beforeEach(module('barServiceProvider')); beforeEach(module('myServiceProvder')); var service; beforeEach(inject(function(fooService, barService, myService) { service=myService; })); it("can be instantiated", function() { expect(service).not.toBeNull(); }); });
这证明了可以通过DI框架创建服务,但是接下来我要对服务进行单元测试,这意味着要模拟注入的对象。
我该怎么做呢?
我试过将我的模拟对象放在模块中,例如
beforeEach(module(mockNavigationService));
并将服务定义重写为:
function MyService(http, fooService, barService) { this.somthing = function() { // Do something with the injected services }; }); angular.module('myServiceProvider', ['fooServiceProvider', 'barServiceProvider']). factory('myService', function ($http, fooService, barService) { return new MyService($http, fooService, barService); })
但是后者似乎停止了DI所创建的所有服务。
有人知道我可以如何为单元测试模拟注入的服务吗?
谢谢
您可以使用来将模拟注入到您的服务中$provide。
$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的过程中。在此处设置嘲讽依赖时,它可能就很容易成为间谍。
$provide.value