Я работаю над тестом e2e для приложения Nestjs, один из модулей использует модуль https://github.com/deligenius/aws-sdk-v3-nest. Я застрял в насмешках над этим.
Я не могу понять, как имитировать клиент S3, внедренный в модуль вложения. При запуске теста фактически используется настоящий клиент S3.
Вот что у меня есть на данный момент.
// app.module
@Module({
imports: [
AttachmentsModule,
],
controllers: [],
providers: [],
})
export class AppModule {
}
// attachment module
@Module({
controllers: [],
providers: [
S3fileService,
],
imports: [
AwsSdkModule.registerAsync({
clientType: S3Client,
imports: [ConfigModule],
useFactory: async (configService: ConfigService<EnvConfigs, true>) => {
const awsConfigs = configService.get('awsConfigs', { infer: true });
return new S3Client({
region: awsConfigs.region,
});
},
inject: [ConfigService],
}),
],
exports: [S3fileService],
})
export class AttachmentsModule {}
// S3fileService service
@Injectable()
export class S3fileService {
constructor(
@InjectAws(S3Client) private readonly s3: S3Client, // I want to mock this S3Client
) {
console.info(s3);// during test this is real s3 instance
}
}
// my test
import { S3Client } from '@aws-sdk/client-s3';
import { mockClient } from 'aws-sdk-client-mock';
const s3Mock = mockClient(S3Client);
describe('InvoicesController (e2e)', () => {
let app: INestApplication;
beforeAll(async () => {
const moduleFixture: TestingModule = await Test.createTestingModule({
imports: [AppModule],
providers: [/// this is not working
{
provide: S3Client,
useValue: s3Mock,
},
],
})
.overrideProvider(S3Client) // this is not working
.useValue(s3Mock)
.compile();
app = moduleFixture.createNestApplication();
await app.init();
});
});
Да, но это не сработало, спасибо
Оказывается, мне нужно использовать правильный токен DI. Я импортировал S3Client в сервис, например @InjectAws(S3Client) Private readonly s3: S3Client, и внутри он генерирует токен вроде AWS_SDK_V3_MODULE#S3Client#. o Я не уверен, что это правильный способ, но он работает!
.overrideProvider('AWS_SDK_V3_MODULE#S3Client#') // this is working
.useValue(s3Mock)
вы пытались использовать
useClass
вместоuseValue
?