我在其他单元测试中遇到了丢失<router-outlet>条消息的情况,但为了有一个很好的独立示例,我创建了一个AuthGuard,用于判断用户是否登录了某些操作.

以下是代码:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    if (!this.authService.isLoggedIn()) {
        this.router.navigate(['/login']);
        return false;
    }
    return true;
}

现在我想为此编写一个单元测试.

以下是我开始测试的方式:

beforeEach(() => {
    TestBed.configureTestingModule({
        imports: [
            RouterTestingModule.withRoutes([
                {
                    path: 'login',
                    component: DummyComponent
                }
            ])
        ],
        declarations: [
            DummyComponent
        ],
        providers: [
            AuthGuardService,
            {
                provide: AuthService,
                useClass: MockAuthService
            }
        ]
    });
});

我创建了一个DummyComponent,它什么都不做.

it('should not let users pass when not logged in', (): void => {
    expect(authGuardService.canActivate(<any>{}, <any>{})).toBe(false);
});

这将引发异常"找不到要加载的主出口".

推荐答案

我可以模拟路由并实现自己的导航功能,但是RouterTestingModule有什么意义呢?也许您甚至想判断一下导航是否工作正常.

没有真正的意义.如果his只是auth guard的一个单元测试,那么只需模拟并监视模拟,以判断它的navigate方法是否使用login参数调用

let router = {
  navigate: jasmine.createSpy('navigate')
}

{ provide: Router, useValue: router }

expect(authGuardService.canActivate(<any>{}, <any>{})).toBe(false);
expect(router.navigate).toHaveBeenCalledWith(['/login']);

这就是通常应该编写unit个测试的方式.为了测试任何实际的导航,这可能属于端到端测试的范畴.

Angular相关问答推荐

Angular - Bootstrap 5 Carbon不工作

如何取消针叶林输入的自动填充?

无法执行客户端功能Angular 17与ssr'

Angular 服务错误处理响应类型=BLOB

try 测试具有Angular material 下拉列表的组件时,在Angular 17中发现&q;错误的意外合成属性@TransitionMessages

Rxjs重置执行后的可观察延迟并重新调度Angular

从canActivate创建时,Angular material 对话框不接收MAT_DIALOG_DATA

Angular 不使用NgRx的简单CRUD应用程序

Angular MSAL - 对 Bearer 令牌和 AUD 属性的怀疑

ngrx 效果等到从初始值以外的其他状态收到响应

没有调用订阅的原因是什么?

Angular:显示带有嵌套子项的内容投影

将 html ngModel 值传递给服务Angular

怎样在 Angular 2 或 4 中将输入字段设为只读?

Angular 2.0 中 $scope 的替代品

导航到同一条route路由不刷新组件?

检测指令中输入值何时更改

Angular 2 组件不是任何 NgModule 的一部分

angular 5 material - 表单字段停留在 180px

Lint 错误:实现生命周期挂钩接口