質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

1回答

2009閲覧

LocalStorageのテストで作ったmockのlengthの挙動がおかしい【angularCLI】

kanegazaki

総合スコア15

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2019/02/19 04:26

編集2019/02/19 06:50

前提・実現したいこと

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から変わりません、なぜでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

これでどうでしょう?
getAccessTokenNumという関数を実行してないので
「関数オブジェクト」と「3」を比べてます

expect(service.getAccessTokenNum).toEqual(3); ↓ expect(service.getAccessTokenNum()).toEqual(3);

mock-length-test
こちらはまだよくわかりません。。。
もうすこし調べてみます。

投稿2019/02/20 00:13

編集2019/02/20 00:44
keisukeh

総合スコア657

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問