簡體   English   中英

e2e 如何與 guard nestjs

[英]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 中MongooseModuleforRoot 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM