1

私はAngular2でサービスをテストしようとしています。このサービスでは、window.locationとwindow.location.hashを何度か使用しています。 Stackoverflowに関する他の質問を読んだ後、私はグローバルウィンドウを直接使用するのではなく、サービスにウィンドウを注入することに決めました。私はapp.module.tsでウィンドウ登録したことについては角度2 - ウィンドウ依存のユニットテストサービス

@Injectable() 
export class AuthService { 
    constructor(private router: Router, private window: Window) { } 
} 

:私のテストで今

providers: [ 
      AuthService, 
      { 
       provide: Window, 
       useValue: window 
      }, 
      OtherService 
] 

を、私はこの答えと同様に窓を模擬しようとしています:https://stackoverflow.com/a/37176904

beforeEach(() => { 
routerStub = { 
    navigate: jasmine.createSpy('navigate') 
}; 
mockWindow = <any> { location: <any> {hash: 'testhash'}}; 
TestBed.configureTestingModule({ 
    providers: [ 
    AuthService, 
    { provide: Router, useValue: routerStub }, 
    { provide: Window, useValue: mockWindow } 
    ] 
}); 

authService = TestBed.get(AuthService); 
}); 

エラー: 'エラー:AuthServiceのすべてのパラメータを解決できません:([オブジェクトオブジェクト]、?)'

モックルーターを注入しても問題なく動作しますが、モックウィンドウを注入しても機能していないようです。誰もこれで私を助けることができますか?私が間違っていることは何ですか?私は私のために働く解決策を見つけることができませんでした。

+0

ブラウザでテストが実行されないため、ウィンドウオブジェクトは定義されていません。ウィンドウ機能をラップし、ウィンドウオブジェクトの存在をチェックする「ウィンドウ」クラスを作成します。存在する場合はそれを返し、それ以外の場合はモックウィンドウを返します。 –

+0

上記のコードでやっている方法と同じように模擬ウィンドウを用意することはできませんか? – Maus94

答えて

0

は、あなたのサービスでこの

のようにそれを試してみてください:あなたは、あなたのサービスを提供し、あなたのモジュールで

constructor(http: Http, @Inject('Window') private window: Window) { 
     super(http); 
     console.log(window.location); 
    } 

、このようにウィンドウを提供します。

providers: [AuthService,{ provide: 'Window', useValue: window }, OtherService] 

次に、あなたのテストに:

... 
mockWindow = { location: {hash: 'testhash'}}; 
TestBed.configureTestingModule({ 
    providers: [ 
    AuthService, 
    { provide: Router, useValue: routerStub }, 
    { provide: 'Window', useValue: mockWindow }, 

    ] 
}); 
... 

しかし、AoTのオープンバグはありません。 https://github.com/angular/angular/issues/15640

関連する問題