【发布时间】:2015-09-09 22:28:30
【问题描述】:
之前肯定有人问过这个问题,但我找不到。我需要模拟一个工厂,但模拟本身需要使用 $q,而关于在注入()之后调用模块(),我最终陷入了先有鸡还是先有蛋的境地。
我查看了这个question,它建议做一个 spyOn,它适用于 services 因为它是一个单例,但我在返回的函数上调用 new我的工厂,每次都创建一个新实例,这样就不行了……
var app = angular.module('app', []);
app.factory('MyDependencyFactory', function() {
return function() {
this.doPromise = function () {
var defer = $q.defer();
//obviously more complicated.
defer.resolve();
return defer.promise;
}
}
});
app.factory('MyConsumingFactory', function(MyDependencyFactory) {
return function() {
var dependency = new MyDependencyFactory();
this.result;
this.doSomething = function () {
dependency.doPromise().then(
function (data) {
this.result = data;
},
function (error) {
console.log(error);
}
);
}
}
});
茉莉花测试:
describe('MyConsumingFactory', function() {
var MyConsumingFactory;
beforeEach(function () {
module('app');
inject( function (_MyConsumingFactory_) {
MyConsumingFactory = _MyConsumingFactory_;
});
inject( function ($q) {
mockMyDependencyFactory = function () {
this.doPromise = function (data) {
var defer = $q.defer();
defer.resolve('mock data');
};
};
});
module( function ($provide) {
$provide.factory('MyDependencyFactory', mockMyDependencyFactory);
});
});
it('works correctly', function () {
MyConsumingFactory.doSomething();
$rootScope.$apply();
expect(MyConsumingFactory.result).toEqual('mock data');
});
});
我需要我的 mockMyDependencyFactory 来使用 $q,所以我需要将它包装在 inject(function(...) 中,并且我需要在调用 module(function ($provide) {... 这当然给了我:
错误:注入器已创建,无法注册模块!
对我如何解决这个问题有什么建议吗?
或者,如果您认为我的设计有缺陷(我想我可以实例化一个 MyDependencyFactory 并在实例化 MyConsumingFactory 期间传递它,而不是使用 angular 的 DI?)我全神贯注 :)
【问题讨论】:
标签: javascript angularjs jasmine