NestJS E2E 테스트 디버깅은 엄청나게 실망스러울 수 있으며, 특히 문서화되지 않은 프레임워크 동작으로 인해 겉으로는 단순해 보이는 문제가 발생할 때 더욱 그렇습니다. 최근 NestJS의 @Processor
데코레이터로 인해 E2E 테스트가 지속적으로 실패하는 문제가 발생했습니다. 이 데코레이터는 테스트에서 즉각적으로 드러나지 않는 복잡성을 도입하는 것으로 나타났습니다.
테스트 실패를 해결하려는 초기 시도에는 몇 가지 일반적인 접근 방식이 포함되었지만 모두 실패했습니다.
ioredis-mock
조롱: ioredis-mock
과의 전체 Redis 상호 작용을 조롱하려는 시도는 근본적인 문제를 해결하지 못했습니다.@Processor
과 조롱핵심 문제는 @Processor
파일 내에서 src/user/audio.consumer.ts
데코레이터를 사용하는 데서 발생했습니다. 이 데코레이터의 동작은 NestJS 문서에 명시적으로 자세히 설명되어 있지 않아 예기치 않은 테스트 실패로 이어집니다.
초기 테스트 설정은 다음과 같습니다.
<code class="language-typescript">import { getQueueToken } from '@nestjs/bullmq'; import { INestApplication } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; import * as request from 'supertest'; import { AppModule } from '../src/app.module'; import { mockBullMqService } from './bullmq.mock'; describe('AppController (e2e)', () => { // ... (beforeAll, afterAll omitted for brevity) it('/ (GET)', () => { return request(app.getHttpServer()) .get('/cart') .expect(200) .expect('Hi'); }); });</code>
@Processor
데코레이터 때문에 실패했습니다. 이 솔루션에는 모의에 대한 보다 표적화된 접근 방식이 필요했습니다.
<code class="language-typescript">const moduleFixture: TestingModule = await Test.createTestingModule({ imports: [AppModule], }) .overrideProvider(getQueueToken('YOUR_QUEUE_NAME')) .useValue({ on: jest.fn(), add: jest.fn(), process: jest.fn(), }) .overrideProvider(AudioConsumer) // Crucial addition .useValue({}) // Provide an empty value .compile();</code>
AudioConsumer
공급자를 빈 개체로 명시적으로 재정의하여 @Processor
데코레이터의 암시적 동작을 우회하고 테스트 실패를 해결했습니다.
@Processor
문제가 해결되었지만 아직 Testcontainers 및 실제 Redis 인스턴스에서 발생하는 문제를 완전히 해결하지 못했습니다. 이러한 특정 오류의 근본 원인을 파악하려면 추가 조사가 필요합니다.
위 내용은 Nestjs에서 etests가 두통을 줄 때의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!