2017-03-27 13 views
4

私は単純なサービスをテストしています。このサービスでは、別のサービスの2つの値が使用されます。Angular2のテスト:サービスの注入された値を変更する

基本的に、私はこれらの2つの値をテストしたいと思います:isLogged = falseをisLogged =真

注入されたサービスの値を変更するだけで済みますか、それとも別の処理が必要ですか? (私は知らないので、途中で私を導くことができれば、私はそれを感謝するだろう)。ここで

は、テストのために私のコードです:私は私の問題への解決策を発見した

EDIT。プロバイダにパラメータを注入する必要があります。その後、そのプロパティを必要に応じて変更できます。

import { TestBed, async, inject } from '@angular/core/testing'; 
    import { AuthGuardService } from './authguard.service'; 
    import { Router } from '@angular/router'; 

    import { AuthService } from './auth.service'; 

    describe('AuthguardService',() => { 

    let calledUrl = '/logged/main/last'; 

    let authServiceStub = { 
     isLogged: false, 
     redirectUrl: calledUrl 
    }; 

    class RouterStub { 
     navigate(url: string) { return url; } 
    }; 

    beforeEach(() => { 
     TestBed.configureTestingModule({ 
     providers: [ 
      AuthGuardService, 
      { provide: AuthService, useValue: authServiceStub }, 
      { provide: Router, useClass: RouterStub }, 
     ] 
     }); 
    }); 

    it('should ...', inject([AuthGuardService, Router], (service: AuthGuardService, router: Router) => { 
     let spy = spyOn(router, 'navigate'); 

     service.checkLoginState(calledUrl); 
     expect(spy).toHaveBeenCalledWith(['/login']); 
    })); 
    }); 
+0

はい、可能です。これは、AuthServiceがどのようなもので、どのように使用されているかによっても異なる場合があります。 – estus

+0

AuthServiceは、 'isLogged'がfalseの場合、' 'login''に​​リダイレクトし、それがtrueの場合、** checkLoginState **に与えられたパラメータ – trichetriche

答えて

0

あなたの指定された解決策は1つの方法です。あなたが達成したいすべてのテストで値を変更する場合には、さらに多くの簡潔な方法は、単純に直接authServiceStubの値を変更することです:

// inside tests: 
authServiceStub.isLogged = false; 
... 
authServiceStub.isLogged = true; 

^シンプルだが非常にカプセル化されていません。

か、それをパラメータ化:

let isLogged: false; 
let authServiceStub = { 
     isLogged: isLogged, 
     redirectUrl: calledUrl 
    }; 
... 
// inside tests: 
isLogged = false; 
... 
isLogged = true; 

^簡潔な、まだカプセル化されていません。

またはsetterを追加します。

let authServiceStub = { 
     isLogged: false, 
     setLogged: function(logged) { this.isLogged = logged; }, 
     redirectUrl: calledUrl 
    }; 
... 
// inside tests: 
setLogged(false); 
... 
setLogged(true); 

^Aは、よりカプセル化されたビット。あなたの注射のアプローチと組み合わせることができます。

それともisLoggedは関数として再実装された場合、あなたはspyOn使用できます。あなたは可能性があるため、(あなたの注射液と組み合わせる場合は特に、

// inside tests: 
spyOn(authServiceStub, "isLogged").and.returnValue(false); 
... 
spyOn(authServiceStub, "isLogged").and.returnValue(true); 

^もっとブラックボックスと潜在的に、より柔軟な/将来性をスタブやモックを大幅に変更しても、やはり必要な動作を得ることができます)。これはもっと前の作業ですので、それほど価値がないかもしれません。しかし、このブラックボックスの方法でAuthServiceを考えると、あなたは関数にリファクタリングされたかどうかの理由がわかるかもしれません。

関連する問題