'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