Javascript e2e测试NestJS时使用测试数据库

Javascript e2e测试NestJS时使用测试数据库,javascript,nestjs,e2e-testing,typeorm,Javascript,Nestjs,E2e Testing,Typeorm,在这个项目中,它使用NestJS和TypeORM。对于真正的API请求,CRUD操作是在MySQL(使用AWS RDS)上操作的 现在我尝试使用SQLite(内存中)来测试API结果 我在单元测试中成功地实现了这一点,如下代码所示 首先,下面是创建内存db.ts,它返回到内存中SQLite数据库的连接 type Entity = Function | string | EntitySchema<any>; export async function createMemoryDB(e

在这个项目中,它使用NestJS和TypeORM。对于真正的API请求,CRUD操作是在MySQL(使用AWS RDS)上操作的

现在我尝试使用SQLite(内存中)来测试API结果

我在单元测试中成功地实现了这一点,如下代码所示

首先,下面是
创建内存db.ts
,它返回到内存中SQLite数据库的连接

type Entity = Function | string | EntitySchema<any>;

export async function createMemoryDB(entities: Entity[]) {
  return createConnection({
    type: 'sqlite',
    database: ':memory:',
    entities,
    logging: false,
    synchronize: true,
  });
}
任何帮助都将不胜感激。谢谢:)


  • 更新:尝试以下操作后出现新错误

好的,我通过在
Test.createTestingModule
的imports字段中使用
TypeOrm.forRoot()
解决了这个问题。下面是我是如何做到的

describe('UserController (e2e)', () => {
  let userService: UserService;
  let userRepository: Repository<User>;
  let app: INestApplication;
  const NAME = 'NAME';
  const EMAIL = 'test@test.com';
  const PASSWORD = '12345asbcd';

  beforeAll(async () => {
    const moduleFixture: TestingModule = await Test.createTestingModule({
      imports: [
        UserModule,
        TypeOrmModule.forRoot({
          type: 'sqlite',
          database: ':memory:',
          entities: [User],
          logging: true,
          synchronize: true,
        }),
      ],
    }).compile();

    app = moduleFixture.createNestApplication();
    await app.init();
    userRepository = moduleFixture.get('UserRepository');
    userService = new UserService(userRepository);
  });

  afterAll(async () => {
    await app.close();
  });

  afterEach(async () => {
    await userRepository.query('DELETE FROM users');
  });
});

description('UserController(e2e)'),()=>{
让userService:userService;
让userRepository:Repository;
let-app:不适用;
常量名称='NAME';
常数电子邮件test@test.com';
常量密码='12345asbcd';
之前(异步()=>{
常量ModuleTexture:TestingModule=Wait Test.createTestingModule({
进口:[
用户模块,
TypeOrmModule.forRoot({
类型:“sqlite”,
数据库:':内存:',
实体:[用户],
日志记录:是的,
同步:对,
}),
],
}).compile();
app=moduleTexture.createNestApplication();
等待app.init();
userRepository=moduleFixture.get('userRepository');
userService=新的userService(userRepository);
});
毕竟(异步()=>{
等待app.close();
});
每次之后(异步()=>{
等待userRepository.query('DELETE FROM users');
});
});

这对我真的很有帮助!谢谢你自己的回答。@CasimirCrystal我很乐意:)
// user.e2e-spec.ts

describe('UserController (e2e)', () => {
  let userController: UserController;
  let userService: UserService;
  let userRepository: Repository<User>;
  let connection: Connection;
  let app: INestApplication;
  const NAME = 'NAME';
  const EMAIL = 'test@test.com';
  const PASSWORD = '12345asbcd';

  beforeAll(async () => {
    connection = await createMemoryDB([User]);
    userRepository = await connection.getRepository(User);
    userService = new UserService(userRepository);
    userController = new UserController(userService);

    const moduleFixture: TestingModule = await Test.createTestingModule({
      imports: [],
      controllers: [UserController],
      providers: [UserService],
    }).compile();

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

  afterAll(async () => {
    await connection.close();
  });

  afterEach(async () => {
    // await userRepository.query('DELETE FROM users');
  });

  it('[POST] /user : Response is OK if conditions are right', () => {
    const dto = new UserCreateDto();
    dto.name = NAME;
    dto.email = EMAIL;
    dto.password = PASSWORD;

    return request(app.getHttpServer())
      .post('/user')
      .send(JSON.stringify(dto))
      .expect(HttpStatus.CREATED);
  });
});
Nest can't resolve dependencies of the UserService (?). Please make sure that the argument UserRepository at index[0] is available in the RootTestModule context.

Potential solutions:
- If UserRepository is a provider, is it part of the current RootTestModule?
- If UserRepository is exported from a seperate @Module, is that module imported within RootTestModule?
  @Module({
    imports: [/* The module containing UserRepository */]
  })


TypeError: Cannot read property 'getHttpServer' of undefined.
describe('UserController (e2e)', () => {
  let userService: UserService;
  let userRepository: Repository<User>;
  let connection: Connection;
  let app: INestApplication;
  const NAME = 'NAME';
  const EMAIL = 'test@test.com';
  const PASSWORD = '12345asbcd';

  beforeAll(async () => {
    connection = await createMemoryDB([User]);
    userRepository = await connection.getRepository(User);
    userService = new UserService(userRepository);

    const moduleFixture: TestingModule = await Test.createTestingModule({
      imports: [UserModule],
    })
      .overrideProvider(UserService)
      .useClass(userService)
      .compile();

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

  afterAll(async () => {
    await connection.close();
  });

  afterEach(async () => {
    await userRepository.query('DELETE FROM users');
  });

  it('[POST] /user : Response is OK if conditions are right', async () => {
    const dto = new UserCreateDto();
    dto.name = NAME;
    dto.email = EMAIL;
    dto.password = PASSWORD;

    const result = await request(app.getHttpServer())
      .post('/user')
      .send(JSON.stringify(dto))
      .expect({ status: HttpStatus.CREATED });
  });
});
TypeError: metatype is not a constructor.

TypeError: Cannot read property 'getHttpServer' of undefined.
describe('UserController (e2e)', () => {
  let userService: UserService;
  let userRepository: Repository<User>;
  let app: INestApplication;
  const NAME = 'NAME';
  const EMAIL = 'test@test.com';
  const PASSWORD = '12345asbcd';

  beforeAll(async () => {
    const moduleFixture: TestingModule = await Test.createTestingModule({
      imports: [
        UserModule,
        TypeOrmModule.forRoot({
          type: 'sqlite',
          database: ':memory:',
          entities: [User],
          logging: true,
          synchronize: true,
        }),
      ],
    }).compile();

    app = moduleFixture.createNestApplication();
    await app.init();
    userRepository = moduleFixture.get('UserRepository');
    userService = new UserService(userRepository);
  });

  afterAll(async () => {
    await app.close();
  });

  afterEach(async () => {
    await userRepository.query('DELETE FROM users');
  });
});