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
允许这个控制器,但我没有看到一个相当于工厂。
有两种方法可以完成我所知道的这样的事情:
- 使用
$provide
和一个匿名模块注入模拟。 - 注入您想要模拟的服务,并使用茉莉花的间谍能力来提供模拟值。
第二个选项只有在你确切地知道被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
(这是提供module
和inject
function的东西)。
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依赖于它们的东西。