测试路由时如何使用tick()函数?

时间:2017-12-20 15:08:02

标签: angular unit-testing

我正在尝试为根组件 *s 运行单元测试,其中 app.component.ts HTML只包含 { {1}}

因此,基于以下路由器配置,应用程序使用app.component.html立即在<router-outlet></router-outlet>启动应用程序:

http://localhost:port/login

我的问题是,当我在 redirectTo 中使用以下方法运行 `export const appRoutes: Routes = [ { path: '', redirectTo: 'login', pathMatch: 'full'}, { path: 'login', component: LoginComponent}, { path: 'add', component: RegisterComponent}, .... ]; export const routes: ModuleWithProviders = RouterModule.forRoot(appRoutes);`

ng test --sm=false

测试失败并显示: app.component.spec.ts 但是当我使用时 这个方法/语法:

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

然后测试通过。

所以,在这种情况下,我无法弄清楚使用 Expected '' to be '/login' 功能等的确切错误。

什么是最佳做法 - 尝试使用第一种方法并修复失败的测试,或者第二项功能是否足够我的测试?

我应该在第一种方法中更改/修复什么才能使用它而不是第二种?

对于更多输入,这里是我正在使用的角度和角度cli版本:

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

1 个答案:

答案 0 :(得分:2)

问题是Platform.runLater()函数不会等到promise在这种情况下解决。您可以使用tick或更高的值等到承诺返回但不准确。

一旦url导航路由器解析了promise,第二个函数中的

。所以你不需要盲目地设置超时值以等到承诺。所以第二种方法更准确