gpt4 book ai didi

javascript - 不要在框架 NestJS 中通过 e2e 测试

转载 作者:搜寻专家 更新时间:2023-10-30 21:13:27 25 4
gpt4 key购买 nike

我使用NestJS 框架。使用 @nestjs/typeorm 时,我创建了一个包含用户的存储库。使用这种方法创建存储库,我的e2e 测试。使用数据库时,所有数据都已成功保存。连接没有问题。这是我的文件:

app.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Connection } from 'typeorm';
import { AuthModule } from './modules/auth/auth.module';

@Module({
imports: [
TypeOrmModule.forRoot(),
AuthModule,
],
})
export class AppModule {
constructor(private readonly connection: Connection) { }
}

auth.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AuthService } from './auth.service';
import { AuthController } from './auth.controller';
import { Users } from '../../entity/Users';

@Module({
imports: [TypeOrmModule.forFeature([Users])],
controllers: [AuthController],
providers: [AuthService],
})
export class AuthModule {}

auth.service.ts

...
// my repo
constructor(
@InjectRepository(Users)
private readonly usersRepository: Repository<Users>,
) { }
...

app.e2e-spec.ts

import { INestApplication } from '@nestjs/common';
import { Test } from '@nestjs/testing';
import * as request from 'supertest';
import { AppModule } from './../src/app.module';

describe('AppController (e2e)', () => {
let app: INestApplication;

beforeAll(async () => {
const moduleFixture = await Test.createTestingModule({
imports: [AppModule],
}).compile();

app = moduleFixture.createNestApplication();
await app.init();
});

it('/ (GET)', () => {
return request(app.getHttpServer())
.get('/')
.expect(404)
.expect('{"statusCode":404,"error":"Not Found","message":"Cannot GET /"}'); //todo fix me
});
});

一切都是按照文档写的。当您运行 npm run test:e2e 时,控制台会出现以下错误:

> project@0.0.0 test:e2e 
> jest --config ./test/jest-e2e.json

[Nest] 7206 - 2/2/2019, 5:06:52 PM [TypeOrmModule] Unable to connect to the database. Retrying (1)...
Error: getaddrinfo ENOTFOUND postgres postgres:5432
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:57:26)
[Nest] 7206 - 2/2/2019, 5:06:55 PM [TypeOrmModule] Unable to connect to the database. Retrying (2)... +3234ms
Error: getaddrinfo ENOTFOUND postgres postgres:5432
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:57:26)
FAIL test/app.e2e-spec.ts (6.198s)
AppController (e2e)
✕ / (GET) (6ms)

● AppController (e2e) › / (GET)

Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.

at mapper (../node_modules/jest-jasmine2/build/queue_runner.js:41:52)

● AppController (e2e) › / (GET)

TypeError: Cannot read property 'getHttpServer' of undefined

17 |
18 | it('/ (GET)', () => {
> 19 | return request(app.getHttpServer())
| ^
20 | .get('/')
21 | .expect(404)
22 | .expect('{"statusCode":404,"error":"Not Found","message":"Cannot GET /"}'); // todo fix me

at Object.<anonymous> (app.e2e-spec.ts:19:24)

请帮帮我!

最佳答案

如果你想用模拟编写 e2e 测试你不需要导入 AppModule 你只需要导入你的 AppControllerAppService ,这样您就可以避免连接到数据库并使用模拟来测试整个应用程序流程。

import { INestApplication } from '@nestjs/common';
import { Test } from '@nestjs/testing';
import * as request from 'supertest';
import { AppController } from './../src/app.controller';
import { AppService } from './../src/app.service';

describe('AppController (e2e)', () => {
let app: INestApplication;

beforeAll(async () => {
const moduleFixture = await Test.createTestingModule({
imports: [],
controllers: [AppController],
providers: [AppService],
}).compile();

app = moduleFixture.createNestApplication();
await app.init();
});

it('/ (GET)', () => {
return request(app.getHttpServer())
.get('/')
.expect(404)
.expect('{"statusCode":404,"error":"Not Found","message":"Cannot GET /"}'); //todo fix me
});
});

通过这种方法,您可以获得一个没有 TypeOrmModule 的干净测试模块。注意:如果您需要模拟服务,Test 有一个方法 overrideProvider 来覆盖您的服务和方法,例如 useClassuseValue useFactory 来提供您的模拟。

如果你想编写一个集成测试来确认所有一起工作正常,你可以覆盖你的 TypeOrmModule 的配置,将它传递给带有新数据库配置的测试模块,如 this post描述。

希望对您有所帮助。祝你好运和问候。

关于javascript - 不要在框架 NestJS 中通过 e2e 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54493998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com