前提・実現したいこと
angularCLIを使っています。
ブラウザのローカルストレージを使うサービスクラスのテストがしたいです。
試したこと
LocalStorageのテストなのでmockを作りました。
LocalStorageに3つのデータが入っていれば
LocalStorage.lengthは3が返ってくるはずで、実際のブラウザで試したら3が返ってきました。
しかしテストコードのmockだと3ではなく0が返ってきます。
TokenServiceのテストのここが怪しいと思ったんですが
文法的に問題なさそうでした。
typescript
1 length: () => { 2 return Object.keys(store).length; 3 } 4
正しい挙動にするにはどうしたからよいですか。
TokenService
typescript
1import {Injectable} from '@angular/core'; 2 3@Injectable() 4export class TokenService { 5 private TOKEN_KEY = 'id_token'; 6 7 constructor() { 8 } 9 10 setAccessToken(token: string) { 11 localStorage.setItem(this.TOKEN_KEY, token); 12 } 13 14 getAccessToken(): string { 15 return localStorage.getItem(this.TOKEN_KEY); 16 } 17 18 getAccessTokenNum() { 19 return localStorage.length; 20 } 21}
TokenServiceのテスト
typescript
1import {TestBed} from '@angular/core/testing'; 2 3import {TokenService} from './token-service.service'; 4 5describe('TokenService', () => { 6 let service: TokenService; 7 8 beforeEach(() => { 9 TestBed.configureTestingModule({ 10 providers: [TokenService] 11 }); 12 service = TestBed.get(TokenService); 13 14 let store = {}; 15 const mockLocalStorage = { 16 getItem: (key: string): string => { 17 return key in store ? store[key] : null; 18 }, 19 setItem: (key: string, value: string) => { 20 store[key] = `${value}`; 21 }, 22 removeItem: (key: string) => { 23 delete store[key]; 24 }, 25 clear: () => { 26 store = {}; 27 }, 28 length: () => { 29 return Object.keys(store).length; 30 } 31 }; 32 33 spyOn(localStorage, 'getItem') 34 .and.callFake(mockLocalStorage.getItem); 35 spyOn(localStorage, 'setItem') 36 .and.callFake(mockLocalStorage.setItem); 37 spyOn(localStorage, 'removeItem') 38 .and.callFake(mockLocalStorage.removeItem); 39 spyOn(localStorage, 'clear') 40 .and.callFake(mockLocalStorage.clear); 41 spyOn(localStorage, 'length') 42 .and.callFake(mockLocalStorage.length); 43 }); 44 45 it('should be created', 46 () => { 47 expect(service).toBeTruthy(); 48 }); 49 50 it('should store the token in localStorage', 51 () => { 52 service.setAccessToken('sometoken'); 53 expect(localStorage.getItem('id_token')).toEqual('sometoken'); 54 }); 55 56 it('should return stored token from localStorage', 57 () => { 58 localStorage.setItem('id_token', 'anothertoken'); 59 expect(service.getAccessToken()).toEqual('anothertoken'); 60 }); 61 62 it('should return stored token number from localStorage', 63 () => { 64 localStorage.setItem('id_token-0', 'aiu'); 65 localStorage.setItem('id_token-1', 'eo'); 66 localStorage.setItem('id_token-2', 'ka'); 67 expect(service.getAccessTokenNum).toEqual(3); 68 }); 69 70 it('mock-length-test', 71 () => { 72 localStorage.setItem('id_token-0', 'aiu'); 73 localStorage.setItem('id_token-1', 'eo'); 74 localStorage.setItem('id_token-2', 'ka'); 75 expect(localStorage.length).toEqual(3); 76 }); 77});
発生している問題・エラーメッセージ
5 specs, 2 failures Spec List | Failures TokenService should return stored token number from localStorage Expected Function to equal 3. Error: Expected Function to equal 3. at stack (http://localhost:9876/absoluteC:/Users/gsakurai/IdeaProjects/Angular-practice/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?0b1eaf7a13cae32191eadea482cfc96ae41fc22b:2455:17) at buildExpectationResult (http://localhost:9876/absoluteC:/Users/gsakurai/IdeaProjects/Angular-practice/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?0b1eaf7a13cae32191eadea482cfc96ae41fc22b:2425:14) at Spec.expectationResultFactory (http://localhost:9876/absoluteC:/Users/gsakurai/IdeaProjects/Angular-practice/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?0b1eaf7a13cae32191eadea482cfc96ae41fc22b:901:18) at Spec.addExpectationResult (http://localhost:9876/absoluteC:/Users/gsakurai/IdeaProjects/Angular-practice/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?0b1eaf7a13cae32191eadea482cfc96ae41fc22b:524:34) at Expectation.addExpectationResult (http://localhost:9876/absoluteC:/Users/gsakurai/IdeaProjects/Angular-practice/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?0b1eaf7a13cae32191eadea482cfc96ae41fc22b:845:21) at Expectation.toEqual (http://localhost:9876/absoluteC:/Users/gsakurai/IdeaProjects/Angular-practice/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?0b1eaf7a13cae32191eadea482cfc96ae41fc22b:2369:12) at UserContext.<anonymous> (http://localhost:9876/_karma_webpack_/webpack:/src/app/token-service.service.spec.ts:67:41) at ZoneDelegate../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:391:1) at ProxyZoneSpec.push../node_modules/zone.js/dist/zone-testing.js.ProxyZoneSpec.onInvoke (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone-testing.js:289:1) at ZoneDelegate../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:390:1) TokenService mock-length-test Expected 0 to equal 3. Error: Expected 0 to equal 3. at stack (http://localhost:9876/absoluteC:/Users/gsakurai/IdeaProjects/Angular-practice/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?0b1eaf7a13cae32191eadea482cfc96ae41fc22b:2455:17) at buildExpectationResult (http://localhost:9876/absoluteC:/Users/gsakurai/IdeaProjects/Angular-practice/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?0b1eaf7a13cae32191eadea482cfc96ae41fc22b:2425:14) at Spec.expectationResultFactory (http://localhost:9876/absoluteC:/Users/gsakurai/IdeaProjects/Angular-practice/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?0b1eaf7a13cae32191eadea482cfc96ae41fc22b:901:18) at Spec.addExpectationResult (http://localhost:9876/absoluteC:/Users/gsakurai/IdeaProjects/Angular-practice/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?0b1eaf7a13cae32191eadea482cfc96ae41fc22b:524:34) at Expectation.addExpectationResult (http://localhost:9876/absoluteC:/Users/gsakurai/IdeaProjects/Angular-practice/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?0b1eaf7a13cae32191eadea482cfc96ae41fc22b:845:21) at Expectation.toEqual (http://localhost:9876/absoluteC:/Users/gsakurai/IdeaProjects/Angular-practice/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?0b1eaf7a13cae32191eadea482cfc96ae41fc22b:2369:12) at UserContext.<anonymous> (http://localhost:9876/_karma_webpack_/webpack:/src/app/token-service.service.spec.ts:75:35) at ZoneDelegate../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:391:1) at ProxyZoneSpec.push../node_modules/zone.js/dist/zone-testing.js.ProxyZoneSpec.onInvoke (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone-testing.js:289:1) at ZoneDelegate../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.j
追記
LocalStorageのlengthはプロパティでした。
なのでspyOnは
typescript
1 spyOnProperty(localStorage, 'length', 'get').and.returnValue(mockLocalStorage.length()); 2
となるはずでした。
しかし、しかし、setItemで何を入れてもstore{}の数が0から変わりません、なぜでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。