我有一个AngularJS服务,在“初始化”时(即在工厂函数中)从localStorage加载数据,如下所示:
module.service('myService', function ($localStorage) {
var data = $localStorage.data;
if (!isValid(data)) // isValid omitted on purpose, not relevant.
data = undefined;
return {
getData: function() {
return data;
}
setData: function(value) {
if (isValid(value))
data = value;
}
};
}
在我的测试中,我想检查data
是否实际从localStorage加载,如果该值存在且有效;这是不关于测试isValid,但使用它的服务初始化和$ localStorage。
我希望能够在我的测试中调用myService工厂。我在beforeEach钩子中得到了一个初始化的实例,因为我还需要测试myService的方法。我想我需要为我的特定初始化测试创建一个不同的实例,但由于服务是AngularJS中的单例,我不确定是否可以这样做。
describe('myService', function() {
myService = $localStorage = null;
beforeEach(module('app'));
beforeEach(inject(function($injector) {
myService = $injector.get('myService');
$localStorage = $injector.get('$localStorage');
});
it('should look for stuff in localStorage on creation', function () {
$localStorage.data = 'my data';
// I'd like to call service factory here!!
myService.getData().should.equal('my data');
});
});
这可以实现吗?我的代码是否具有难以测试的结构,或者我不尊重“Angular方式”,这应该以不同的方式完成吗?
答案 0 :(得分:3)
试试这个:
describe('myService', function() {
myService = $localStorage = null;
beforeEach(module('app'));
beforeEach(inject(function($injector) {
$localStorage = $injector.get('$localStorage');
$localStorage.data = 'my data';
myService = $injector.get('myService');
});
it('should look for stuff in localStorage on creation', function () {
myService.getData().should.equal('my data');
});
});