当单元测试一个Angular工厂(使用Karma Jasmine)时,如何将一个stub依赖注入到测试的工厂?
这里是我的工厂:
mod = angular.module('myFactoryMod',[]); mod.factory('myFactory',[ '$log','oneOfMyOtherServices',function($log,svc) { return makeSomethingThatDoesSomethingWithTheseDependencies($log,svc); } ]);
当实例化我的工厂时需要oneOfMyOtherServices。
这里是我的测试:
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(); } ]); })
N.B.我知道$控制器允许这个控制器,但我没有看到一个等价的工厂。
有两种方法来完成这样的事情,我知道:
>使用$ provide和一个匿名模块注入模拟。
>注入你想要模拟的服务,并使用茉莉花的间谍能力提供模拟值。
第二个选项只有当你确切知道测试中的代码将调用注入的服务,你可以很容易地模拟它们的工作。由于您似乎正在访问服务(而不是方法)上的数据属性追求第一个选项可能是最好的。
使用$ 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(); })); });