在新冠疫情期间,我在办公室所能做的就是为某些应用程序进行单元测试。我做的最后一个测试是一个 canActivate 服务,它看起来像这样:
import {Injectable} from "@angular/core";
import {ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot} from "@angular/router";
import {UserProvider} from "../core/app-initializers/user-provider.service";
import {permissionsList} from "../shared/models/permissions.model";
@Injectable()
export class CreateArrangementPermissionService implements CanActivate {
constructor(private router: Router, private userProvider: UserProvider) {}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
if(route.params.idOrCreationKeyWord && route.params.idOrCreationKeyWord == 'create') {
if (this.userProvider.getConnectedUsersApplicativeRoles().indexOf(permissionsList.DECLARANT) < 0) {
this.router.navigate(['/forbidden']);
return false;
}
}
return true;
}
}
我已经编写了测试:
import { CreateArrangementPermissionService } from "./create-arr-permission-service";
import { TestBed, getTestBed } from "@angular/core/testing";
import { UserProvider } from "../core/app-initializers/user-provider.service";
import { Router } from "@angular/router";
describe('CreateArrangementPermissionService Unit tests', () => {
let injector: TestBed;
let userProvider = {
getConnectedUsersApplicativeRoles: function() {
return 'zorro'
}
};
let guard: CreateArrangementPermissionService;
let routeMock: any = {
snapshot: {},
params: {
idOrCreationKeyWord: 'create'
}
};
let routerStateMock: any = {
snapshot: {},
url: '/forbidden'
};
let routerMock = {
navigate: jasmine.createSpy('navigate')
};
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
{ provide: UserProvider, useValue: userProvider},
{ provide: Router, useValue: routerMock },
AuthenticationErrorHandler,
AuthenticationErrorCommunicator,
CreateArrangementPermissionService,
]
});
injector = getTestBed();
userProvider = injector.get(UserProvider);
guard = injector.get(CreateArrangementPermissionService)
});
it('should redirect an unauthenticated user to forbidden', () => {
expect(guard.canActivate(routeMock, routerStateMock)).toEqual(false);
expect(routerMock.navigate).toHaveBeenCalledWith(['/forbidden'])
});
it('should allow the authenticated user to access app', () => {
let routeMockAdmin: any = {
snapshot: {},
params: {
idOrCreationKeyWord: 'TPRM_ADMINISTRATOR'
}
};
expect(guard.canActivate(routeMockAdmin, routerStateMock)).toEqual(true);
});
});
通过这个测试,我在 SonarQube 上获得了 89.5% 的覆盖率,缺少对构造函数和“indexOf()”的一些测试。
希望这个例子能比我自己试验更容易地帮助其他对 canActivate 的正确测试。