【发布时间】:2021-02-26 04:26:45
【问题描述】:
我正在尝试使用 NestJs 作为后端框架来开发应用程序。目前我正在为控制器编写一些集成测试。
这是我第一个使用 typescript 的项目,我通常使用 Java/Spring,但我想学习并尝试使用 nestJs。
我使用不同的守卫来访问其他端点。在这种情况下,我有一个 AuthGuard 和 RolesGuard
为了使其余端点工作,我只需在 TestingModuleBuilder 中添加类似这样的内容:
.overrideGuard(AuthGuard())
.useValue({ canActivate: () => true })
关键是,是否可以为每个测试定义或覆盖此保护,以检查在未定义保护或不允许保护的情况下请求是否失败?
我的测试代码如下:
describe('AuthController integration tests', () => {
let userRepository: Repository<User>
let roleRepository: Repository<Role>
let app: INestApplication
beforeAll(async () => {
const module = await Test.createTestingModule({
imports: [
AuthModule,
TypeOrmModule.forRoot(typeOrmConfigTest),
PassportModule.register({ defaultStrategy: 'jwt' }),
JwtModule.register({
secret: jwtConfig.secret,
signOptions: {
expiresIn: jwtConfig.expiresIn
}
})
]
})
.overrideGuard(AuthGuard())
.useValue({ canActivate: () => true })
.overrideGuard(RolesGuard)
.useValue({ canActivate: () => true })
.compile()
app = module.createNestApplication()
await app.init()
userRepository = module.get('UserRepository')
roleRepository = module.get('RoleRepository')
const initializeDb = async () => {
const roles = roleRepository.create([
{ name: RoleName.ADMIN },
{ name: RoleName.TEACHER },
{ name: RoleName.STUDENT }
])
await roleRepository.save(roles)
}
await initializeDb()
})
afterAll(async () => {
await roleRepository.query(`DELETE FROM roles;`)
await app.close()
})
afterEach(async () => {
await userRepository.query(`DELETE FROM users;`)
})
describe('users/roles (GET)', () => {
it('should retrieve all available roles', async () => {
const { body } = await request(app.getHttpServer())
.get('/users/roles')
.set('accept', 'application/json')
.expect('Content-Type', /json/)
.expect(200)
expect(body).toEqual(
expect.arrayContaining([
{
id: expect.any(String),
name: RoleName.STUDENT
},
{
id: expect.any(String),
name: RoleName.TEACHER
},
{
id: expect.any(String),
name: RoleName.ADMIN
}
])
)
})
})
【问题讨论】:
标签: javascript typescript testing jestjs nestjs