I would like to be able to test my Nest service against an actual database. I understand that most unit tests should use a mock object, but it also, at times, makes sense to test against the database itself.
I have searched through SO and the GH issues for Nest, and am starting to reach the transitive closure of all answers. 🙂
I am trying to work from https://github.com/nestjs/nest/issues/363#issuecomment-360105413. Following is my Unit test, which uses a custom provider to pass the repository to my service class.
describe("DepartmentService", () => { const token = getRepositoryToken(Department); let service: DepartmentService; let repo: Repository<Department>; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [ DepartmentService, { provide: token, useClass: Repository } ] }).compile(); service = module.get<DepartmentService>(DepartmentService); repo = module.get(token); });
Everything compiles properly, TypeScript seems happy. However, when I try to execute create
or save
on my Repository
instance, the underlying Repository
appears to be undefined. Here’s the stack backtrace:
TypeError: Cannot read property 'create' of undefined at Repository.Object.<anonymous>.Repository.create (repository/Repository.ts:99:29) at DepartmentService.<anonymous> (relational/department/department.service.ts:46:53) at relational/department/department.service.ts:19:71 at Object.<anonymous>.__awaiter (relational/department/department.service.ts:15:12) at DepartmentService.addDepartment (relational/department/department.service.ts:56:16) at Object.<anonymous> (relational/department/test/department.service.spec.ts:46:35) at relational/department/test/department.service.spec.ts:7:71
It appears that the EntityManager
instance with the TypeORM Repository
class is not being initialized; it is the undefined
reference that this backtrace is complaining about.
How do I get the Repository
and EntityManager
to initialize properly?
thanks, tom.
Advertisement
Answer
To initialize typeorm properly, you should just be able to import the TypeOrmModule
in your test:
Test.createTestingModule({ imports: [ TypeOrmModule.forRoot({ type: 'mysql', // ... }), TypeOrmModule.forFeature([Department]) ]