私はinitのローカルストレージからデータをロードする別のサービスを使用するAngularサービスを持っています。cant update jasmine spy
angular
.module('app')
.factory('localStorage', function ($window)
{
if (!$window.localStorage)
{
// throw Error
}
return $window.localStorage;
});
angular
.module('app')
.factory('session', function (localStorage)
{
var container = JSON.parse(localStorage.getItem('sessionContainer'));
return {
getUser: getUser
};
});
ここでセッションサービスをテストします。
describe('SessionService', function()
{
var service;
var localStorageMock;
// Load the module.
beforeEach(module('appRegistration'));
// Create mocks.
beforeEach(function()
{
logMock = {};
localStorageMock = jasmine.createSpyObj('localStorageServiceMockSpy', ['setItem', 'getItem']);
localStorageMock.getItem.and.returnValue('{}');
module(function ($provide)
{
$provide.value('localStorage', localStorageMock);
});
inject(function (_session_)
{
service = _session_;
});
});
it('should call `getItem` on the `localStorageService` service', function()
{
expect(localStorageMock.getItem).toHaveBeenCalledWith('sessionContainer');
});
describe('getUser method', function()
{
it('should return an empty object when the user is not set', function()
{
var result = service.getUser();
expect(result).toEqual({});
});
it('should return the user data', function()
{
// localStorageMock.getItem.and.returnValue('{"user":{"some":"data"}}');
var result = service.getUser();
expect(result).toEqual({some: 'user data'});
});
});
});
should return the user data
セクションで確認できます。 container
を更新する方法が必要なので、getUser
は予想されるデータを返します。
私はgetItem
スパイを更新しようとしましたが、これは動作しません。 localStorageMock
は、スパイを変更したいときにすでにsession
サービスに挿入されています。
助けが必要ですか?
var getItemValue;
beforeEach({
localStorage: {
getItem: jasmine.createSpy().and.callFake(function() {
return getItemValue;
}),
setItem: jasmine.createSpy()
}
});
...
it('should return the user data', function()
{
getItemValue = '{"user":{"some":"data"}}';
inject(function (_session_) {
service = _session_;
});
var result = service.getUser();
expect(result).toEqual({some: 'user data'});
});
inject
は、(すべての仕様のためit
にbeforeEach
からスペックを移動する必要があることに注意してくださいドン」:
シンプルなソリューションは完璧です。ありがとう。 答えがES5に変更された場合は有権者投票を得ます – WitteStier
あなたは矢印の機能については、読みやすさの点では良い例ですが、通常のものに置き換えました。 – estus