try 熟悉路由警卫的单元测试.我有一个相对直接的后卫,它从主题asObservable获取一个值,以初始化UrlTree或返回布尔值.
在浏览器调试器中,我无法进入map函数来查看任何值,并且我的测试失败,因为从未调用过间谍方法.提前感谢您的任何帮助或见解.
guard
export const loginGuard: CanActivateFn = () => {
const userService: UserService = inject(UserService);
const router: Router = inject(Router);
return userService.isLoggedIn$
.pipe(
take(1),
map(loggedIn => {
return loggedIn ? router.createUrlTree(['/dashboard']) : true;
}));
};
test
const executeGuard: CanActivateFn = (...guardParameters) =>
TestBed.runInInjectionContext(() => loginGuard(...guardParameters));
const mockRouter = jasmine.createSpyObj('Router', ['createUrlTree']);
const mockUserService = jasmine.createSpyObj('UserService', [], {isLoggedIn$: of(true)});
let activatedRoute: ActivatedRoute;
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
{provide: Router, useValue: mockRouter},
{provide: UserService, useValue: mockUserService},
{
provide: ActivatedRoute,
useValue: {
snapshot: {}
}
}
]
});
activatedRoute = TestBed.inject(ActivatedRoute);
});
it('should redirect to dashboard', () => {
executeGuard(activatedRoute.snapshot, {} as RouterStateSnapshot);
expect(mockRouter.createUrlTree).toHaveBeenCalledWith('/dashboard');
});
it('should proceed to login', () => {
mockUserService.isLoggedIn$ = of(false);
const canActivate = executeGuard(activatedRoute.snapshot, {} as RouterStateSnapshot);
expect(canActivate).toBeTruthy();
});