在单元测试Angular工厂(使用Karma + Jasmine)时,如何将存根依赖注入被测工厂?
这是我的工厂:
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();
}
]);
})
注意:我知道$controller
允许控制器这样做,但我没有看到工厂这样做。
发布于 2014-11-26 15:53:46
@bentsai的评论实际上对测试服务非常有帮助;为了完整性,我添加了一个示例。
这是一个针对jasmine
的测试,它所做的大致就是您想要的。注意:这需要包含angular-mocks
(这是提供诸如module
和inject
的函数)。
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应用程序中所期望的那样-因此,您可以构建需求来支持依赖于它们的测试。
https://stackoverflow.com/questions/16565531
复制相似问题