如何在内部对使用localStorage的AngularJS服务进行单元测试

tan*_*may 3 javascript unit-testing local-storage jasmine angularjs

如何$window.localStorage使用Jasmine和ngMock对内部使用的工厂进行单元测试?

这是类似于我的东西:

myApp.factory('myData',function ($window) {
    return { 
        message: $window.localStorage['stuff'] 
    }
});
Run Code Online (Sandbox Code Playgroud)

谢谢你!

and*_*sit 6

以下适用于Jasmine 2.4:

angular.module('MyModule', []).factory('myData',function ($window) {
    return { 
        message: function(){
          return $window.localStorage['stuff'] ;
        }
    }
});

describe("TestName", function() {
  beforeEach(module('MyModule'));
  var myData, store;
  beforeEach(inject(function(_myData_) {
    myData = _myData_;
    store = {};
    var localStorage = window.localStorage;
    spyOn(localStorage, 'getItem').and.callFake(function (key) {
      return store[key];
    });
    spyOn(localStorage, 'setItem').and.callFake(function (key, value) {
      return store[key] = value + '';
    });
    spyOn(localStorage, 'clear').and.callFake(function () {
      store = {};
    });
  }));

  it("feature desc", function() {
    localStorage['stuff'] = 'hello';
    expect(myData.message()).toEqual('hello');
  });
});
Run Code Online (Sandbox Code Playgroud)

注意使用_myData_下划线技巧(参见docs).