Как е2е со сторожем - PullRequest
0 голосов
/ 13 октября 2019

Я хочу получить конечную точку с именем nestjs /users, но я получил ошибку. У меня есть сомнения, как пройти тест с защитой.

Первая ошибка

Nest не может разрешить зависимости UserModel (?). Убедитесь, что аргумент DatabaseConnection по индексу [0] доступен в контексте MongooseModule.

Вторая ошибка

ожидается 200 "ОК", получено 401 "Не авторизовано"

App.module

@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 });
  }
}

UsersService

@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('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 file

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();
  });
});

1 Ответ

1 голос
/ 13 октября 2019

В модульном тесте вы тестируете один модуль (сервис, контроллер, ...), что означает, что вы импортируете один модуль и проверяете все его зависимости. Однако в тесте e2e вы хотите протестировать ваше целое приложение , поэтому вы должны импортировать корневой модуль (AppModule) вместо отдельных модулей или модулей. Иногда вам может потребоваться смоделировать определенные части вашего приложения, такие как база данных или сторонний API;вы можете сделать это с помощью overrideProvider и т. д.

В вашем случае вы, вероятно, пропускаете импорт forRoot MongooseModule из вашего 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' }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...