测试AngularJS服务初始化

时间:2014-02-22 18:12:20

标签: javascript angularjs unit-testing

我有一个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方式”,这应该以不同的方式完成吗?

1 个答案:

答案 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');
  });
});