2017-12-20 4 views
0

I'amそのためのアプリがhttp://localhost:port/loginには、次のルータの設定に基づいてredirectToを使用してすぐに開始ルートコンポーネントapp.component.html HTMLだけで<router-outlet></router-outlet>経路をテストする際にtick()関数を使用するには?

が含まれていapp.component.tsのためのユニットテストを実行しようとしている:

`export const appRoutes: Routes = [ 
    { path: '', redirectTo: 'login', pathMatch: 'full'}, 
    { path: 'login', component: LoginComponent}, 
    { path: 'add', component: RegisterComponent}, 
    .... 
]; 
export const routes: ModuleWithProviders = RouterModule.forRoot(appRoutes);` 

私の問題は私が実行したときです。app.component.spec.tsに以下の方法を用いて/持つ:

it('navigate to "" redirects you to /login', fakeAsync(() => { 
     router.navigate([""]); 
     tick(); 
     expect(location.path()).toBe("/login"); 
    }) 
); 

テストが失敗し、それが示す:Expected '' to be '/login'私はこのメソッド/構文を 使用する場合:

it("root should be able to navigate to `/login`", fakeAsync(() => { 
     fixture.detectChanges(); 
     // initial navigation 
     router.navigate([""]).then(() => { 
      expect(router.url).toEqual("/login"); 
     }); 
    }) 
); 

次に、テストに合格。

この場合、tick()関数などを使って正確に何が間違っているのか分かりません。

ベストプラクティスは何ですか?最初の方法を試して、失敗したテストを修正するか、2番目の関数がテストに十分なのでしょうか?

2番目の代わりに使用するには、最初の方法で何を変更/修正する必要がありますか?

以上の入力については、こちらを使用して、角と角-CLIバージョンI'amは次のとおりです。

Angular CLI: 1.5.0 
Node: 8.0.0 
OS: darwin x64 
Angular: 5.0.3 
... animations, common, compiler, compiler-cli, core, forms 
... http, language-service, platform-browser 
... platform-browser-dynamic, router 

@angular/cdk: 5.0.0-rc.2 
@angular/cli: 1.5.0 
@angular/material: 5.0.0-rc.2 
@angular-devkit/build-optimizer: 0.0.33 
@angular-devkit/core: 0.0.21 
@angular-devkit/schematics: 0.0.37 
@ngtools/json-schema: 1.1.0 
@ngtools/webpack: 1.8.0 
@schematics/angular: 0.1.7 
typescript: 2.4.2 
webpack: 3.8.1 
+0

2番目の方法は、通常コンポーネントテストをどのように実行するかです。あなたは何の角度とng-cliバージョンを使用していますか? – Zlatko

+0

@Zlatko:私は質問を更新しました...角度と角度cliのバージョンに関する情報を追加しました。 –

答えて

2

問題は、約束が、この場合、解決するまでtick機能が待機しないです。あなたは約束を返すまで待つのにtick(2000)以上の値を使うことができますが、それは正確ではありません。

第2の機能では、URLがルーターをナビゲートするとすぐに約束が解決されます。約束まで待つためにタイムアウト値を盲目的に設定する必要はありません。 2番目の方法はより正確です

+0

それは本当です...それは約束を解決することと関係していますが、tick(2000)を使ったヒントは本当に役に立たなかった...私は 'tick(10000)'を使った。何が助けになったのは、 'then()'関数を追加して、最初の関数を ''( ''/login 'にリダイレクトする ""にナビゲートして)、fakeAsync(()=> {fixture.detectChanges(); router.navigate toBe( "/ login");});})) '。();}(' ')このようにして、テストは合格になります。 –

+0

「then」はすでに使用しているので、ダニ関数を使う必要はないと思うよ –

+1

それは本当です...私は同意します。私はそれが私の問題を何とか解決し、それが最初のものよりもはっきりしているので、2番目の方法に行くつもりです。 –

関連する問題