Nano Hash - криптовалюты, майнинг, программирование

Как e2e с охраной nestjs

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

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

Nest не может разрешить зависимости пользовательской модели (?). Убедитесь, что аргумент 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 файл

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

В модульном тесте вы тестируете один модуль (сервис, контроллер, ...), что означает, что вы импортируете один модуль и имитируете все его зависимости. Однако в тесте 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' }));
13.10.2019
  • Привет, спасибо за ответ, я обновляю вопрос с вашими изменениями (он работает), но сохраняю свой вопрос о фиктивном токене jwt для прохода JwtAuthGuard. Благодарность ! 13.10.2019
  • @ anthonywillismuñoz См. мою редакцию. Ошибка 401 является ожидаемой, поскольку ваш API защищен. На самом деле хорошо проверить, что неаутентифицированные запросы не могут получить доступ к вашему API. Для тестирования защищенного ресурса необходимо установить заголовок авторизации, см. Пример. Кроме того, вам не нужно импортировать все свои модули. Только импортируйте AppModule. Он сам импортирует все остальные модули. 13.10.2019
  • @ Ким Керн Что такое httpServiceMock? Я столкнулся с той же проблемой и не могу ее понять 13.11.2019
  • @MegaRoks Посмотрите эту ветку о том, как создать макет: stackoverflow.com/a/55366343/4694994 13.11.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..