I use the NestJS framework. When using @nestjs/typeorm, I create a repository with users. Using this approach to creating a repository, my e2e tests. When working with a database, all data is successfully saved. There are no problems with the connection. Here are my files:
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
});
});
Everything is written in accordance with the documentation. When you run npm run test:e2e, the console gives the following error:
> [email protected] 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)
Please, help me!
Firstly, they're usually slow to run. Since you have to boot the whole app on a server and then in a browser to test it, it commonly takes 5 or 10 mins for an E2E suite to run.
End-to-end testing, also known as E2E testing, is a methodology used for ensuring that applications behave as expected and that the flow of data is maintained for all kinds of user tasks and processes. This type of testing approach starts from the end user's perspective and simulates a real-world scenario.
If you want to write e2e tests with mocks you don't need to import the AppModule
you only should import your AppController
and AppService
, in this way you avoid to connect to your database and use mocks to test the entire application flow.
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
});
});
With this approach you get a clean testing module without TypeOrmModule
.
NOTE: if you need to mock the service, the Test
has a method overrideProvider
to override your service and mothods like useClass
, useValue
or useFactory
to provide your mock.
If you want to write an integration test to confirm that all together works fine you can override the configuration of your TypeOrmModule
, passing it to the testing module with a new DB configuration like this post describes.
I hope I've helped. Good luck and regards.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With