'Testing Nest Service connected to TypeORM Repository
I have the following test, I would like to:
- Test the service that communicates with the database
- Setup the database repository (TypeORM)
- Cleanup the database to avoid side effects
import { Test, TestingModule } from '@nestjs/testing';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Connection, Repository } from 'typeorm';
import { factory, tearDownDatabase, useRefreshDatabase } from 'typeorm-seeding';
import { Question } from '../entities/question.entity';
import { QuestionsService } from './questions.service';
describe('QuestionsService', () => {
let service: QuestionsService;
let connection: Connection;
beforeAll(async () => {
connection = await useRefreshDatabase();
return connection;
});
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
imports: [TypeOrmModule.forFeature([Question])],
providers: [QuestionsService],
}).compile();
service = module.get<QuestionsService>(QuestionsService);
});
afterAll(async () => tearDownDatabase());
it('should be defined', () => {
expect(service).toBeDefined();
});
it('should return public questions only', async (done) => {
const publicQuestion = await factory(Question)().create({ private: false });
const privateQuestion = await factory(Question)().create({ private: true });
const publicQuestions = await service.findAllPublic();
expect(publicQuestions.map((q) => q.id)).toEqual([publicQuestion.id]);
done();
});
});
Tests fails when attempting to resolve the dependencies of the QuestionsService:
FAIL src/questions/questions.service.spec.ts (7.364 s)
● QuestionsService › should be defined
Nest can't resolve dependencies of the QuestionRepository (?). Please make sure that the argument Connection at index [0] is available in the TypeOrmModule context.
Potential solutions:
- If Connection is a provider, is it part of the current TypeOrmModule?
- If Connection is exported from a separate @Module, is that module imported within TypeOrmModule?
@Module({
imports: [ /* the Module containing Connection */ ]
})
at TestingInjector.lookupComponentInParentModules (../node_modules/@nestjs/core/injector/injector.js:202:19)
at TestingInjector.resolveComponentInstance (../node_modules/@nestjs/core/injector/injector.js:157:33)
at TestingInjector.resolveComponentInstance (../node_modules/@nestjs/testing/testing-injector.js:16:45)
at resolveParam (../node_modules/@nestjs/core/injector/injector.js:108:38)
at async Promise.all (index 0)
at TestingInjector.resolveConstructorParams (../node_modules/@nestjs/core/injector/injector.js:123:27)
at TestingInjector.loadInstance (../node_modules/@nestjs/core/injector/injector.js:52:9)
at TestingInjector.loadProvider (../node_modules/@nestjs/core/injector/injector.js:74:9)
at TestingInjector.lookupComponentInImports (../node_modules/@nestjs/core/injector/injector.js:236:17)
● QuestionsService › should return public questions only
Nest can't resolve dependencies of the QuestionRepository (?). Please make sure that the argument Connection at index [0] is available in the TypeOrmModule context.
Potential solutions:
- If Connection is a provider, is it part of the current TypeOrmModule?
- If Connection is exported from a separate @Module, is that module imported within TypeOrmModule?
@Module({
imports: [ /* the Module containing Connection */ ]
})
at TestingInjector.lookupComponentInParentModules (../node_modules/@nestjs/core/injector/injector.js:202:19)
at TestingInjector.resolveComponentInstance (../node_modules/@nestjs/core/injector/injector.js:157:33)
at TestingInjector.resolveComponentInstance (../node_modules/@nestjs/testing/testing-injector.js:16:45)
at resolveParam (../node_modules/@nestjs/core/injector/injector.js:108:38)
at async Promise.all (index 0)
at TestingInjector.resolveConstructorParams (../node_modules/@nestjs/core/injector/injector.js:123:27)
at TestingInjector.loadInstance (../node_modules/@nestjs/core/injector/injector.js:52:9)
at TestingInjector.loadProvider (../node_modules/@nestjs/core/injector/injector.js:74:9)
at TestingInjector.lookupComponentInImports (../node_modules/@nestjs/core/injector/injector.js:236:17)
QuestionsService is setup as follows:
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Question } from '../entities/question.entity';
@Injectable()
export class QuestionsService {
constructor(
@InjectRepository(Question)
private questionsRepository: Repository<Question>,
) {}
findAllPublic() {
return this.questionsRepository.find({
where: { private: false },
select: ['id', 'question', 'createdAt', 'updatedAt'],
relations: ['answers', 'answers.answerer'],
});
}
}
I have tried to add the repository as a dependency in the TestingModule, but it fails. What am I missing?
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
