unit testing有依赖关系的AngularJS工厂

当unit testing一个Angular工厂(Karma + Jasmine)时,如何在被测工厂注入一个存根依赖项?

这是我的工厂:

mod = angular.module('myFactoryMod', []); mod.factory('myFactory', [ '$log', 'oneOfMyOtherServices', function($log, svc) { return makeSomethingThatDoesSomethingWithTheseDependencies($log, svc); } ]); 

在实例化我的工厂时需要一个或多个其他服务。

这是我的testing:

 it('can get an instance of my factory', function() { var oneOfMyOtherServicesStub; angular.mock.module('myFactoryMod'); oneOfMyOtherServicesStub = { someVariable: 1 }; //****How do I get my stub in my target? **** angular.mock.inject(['myFactory', function(target) { expect(target).toBeDefined(); } ]); }) 

NB我知道$controller允许这个控制器,但我没有看到一个相当于工厂。

有两种方法可以完成我所知道的这样的事情:

  1. 使用$provide和一个匿名模块注入模拟。
  2. 注入您想要模拟的服务,并使用茉莉花的间谍能力来提供模拟值。

第二个选项只有在你确切地知道被testing的代码将被调用到注入服务上的哪些方法的情况下才能正常工作,并且可以轻松地将它们嘲笑出来。 由于您似乎正在访问服务(而不是方法)上的数据属性,所以追求第一个选项可能是最好的。

使用$provide将大致如下所示:

 describe('myFactory', function () { // Load your module. beforeEach(module('myFactoryMod')); // Setup the mock service in an anonymous module. beforeEach(module(function ($provide) { $provide.value('oneOfMyOtherServicesStub', { someVariable: 1 }); })); it('can get an instance of my factory', inject(function(myFactory) { expect(myFactory).toBeDefined(); })); }); 

@bentsai的评论其实对testing服务非常有帮助; 为了完整,我添加了一个例子。

这是一个testingjasmine ,大约你在找什么。 注意:这需要你包含angular-mocks (这是提供moduleinjectfunction的东西)。

 describe('app: myApp', function() { beforeEach(module('myApp')); var $controller; beforeEach(inject(function(_$controller_) { $controller = _$controller_; })); // Factory of interest is called MyFactory describe('factory: MyFactory', function() { var factory = null; beforeEach(inject(function(MyFactory) { factory = MyFactory; })) it('Should define methods', function() { expect(factory.beAwesome).toBeDefined() expect(factory.beAwesome).toEqual(jasmine.any(Function)) }); }); }); 

这是模块和相关工厂定义可能的样子:

 var app = angular.module('myApp', []); app.factory('MyFactory', function() { var factory = {}; factory.beAwesome = function() { return 'Awesome!'; } return factory; }); 

在这种情况下,通过使用inject() ,您可以像使用正常的angular度应用程序一样获得依赖关系,因此您可以构build需求来支持testing依赖于它们的东西。