[英]How e2e with guard nestjs
我想使用nestjs 對一個名為/users
的端點進行e2e,但出現錯誤。 我懷疑如何讓警衛通過測試。
第一個錯誤
Nest 無法解析 UserModel (?) 的依賴關系。 請確保索引 [0] 處的參數 DatabaseConnection 在 MongooseModule 上下文中可用。
第二個錯誤
預期 200 “OK”,得到 401 “Unauthorized”
應用模塊
@Module({
imports: [
MongooseModule.forRootAsync({
imports: [ConfigModule],
useFactory: async (configService: ConfigService) => ({
uri: configService.mongoUri,
useNewUrlParser: true,
}),
inject: [ConfigService],
}),
GlobalModule,
UsersModule,
AuthModule,
PetsModule,
RestaurantsModule,
ConfigModule,
],
controllers: [],
providers: [],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(TokenDataMiddleware)
.forRoutes({ path: '*', method: RequestMethod.ALL });
}
}
用戶服務
@Injectable()
export class UsersService {
constructor(
@InjectModel('User') private readonly userModel: Model<UserDocument>,
private readonly utilsService: UtilsService,
private readonly configService: ConfigService,
) { }
async getAllUsers(): Promise<UserDocument[]> {
const users = this.userModel.find().lean().exec();
return users;
}
}
Controller
@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService, private readonly utilsService: UtilsService) { }
@Get()
@ApiBearerAuth()
@UseGuards(JwtAuthGuard)
async users() {
const users = await this.usersService.getAllUsers();
return users;
}
e2e 文件
describe('UsersController (e2e)', () => {
let app: INestApplication;
beforeAll(async () => {
const testAppModule: TestingModule = await Test.createTestingModule({
imports: [AppModule, GlobalModule,
UsersModule,
AuthModule,
PetsModule,
RestaurantsModule,
ConfigModule],
providers: [],
}).compile();
app = testAppModule.createNestApplication();
await app.init();
});
it('GET all users from API', async () => {
// just mocked users;
const users = getAllUsersMock.buildList(2);
const response = await request(app.getHttpServer())
.get('/users')
.expect(200);
});
afterAll(async () => {
await app.close();
});
});
在單元測試中,您測試一個單元(服務、controller、...),這意味着您導入一個單元並模擬其所有依賴項。 但是,在 e2e 測試中,您想要測試整個應用程序,因此您應該導入根模塊 ( AppModule
) 而不是單個單元或模塊。 有時您可能想要模擬應用程序的特定部分,例如數據庫或第 3 方 API; 你可以用overrideProvider
等來做到這一點。
在您的情況下,您可能缺少 AppModule 中MongooseModule
的forRoot
AppModule
。 導入 AppModule,而不是重組應用程序的某些部分:
await Test.createTestingModule({
imports: [AppModule],
}).compile()
.overrideProvider(HttpService)
.useValue(httpServiceMock);
如果 API 受到保護,您需要對其進行身份驗證。 您可以通過編程方式創建 JWT 或使用您的 API 。 我假設您在以下示例中有一個用於身份驗證的端點:
const loginResponse = await request(app.getHttpServer())
.post('/auth/login')
.send({ username: 'user', password: '123456' })
.expect(201);
// store the jwt token for the next request
const { jwt } = loginResponse.body;
await request(app.getHttpServer())
.get('/users')
// use the jwt to authenticate your request
.set('Authorization', 'Bearer ' + jwt)
.expect(200)
.expect(res => expect(res.body.users[0])
.toMatchObject({ username: 'user' }));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.