Supertest: Cannot inject the dependency at position #0 of

Created on 31 Jul 2020  ·  9Comments  ·  Source: visionmedia/supertest

I try create a test but this error persist. Maybe any incompatibility? ( On Insomnia all works fine.)
When I use .get('/products') always returns code 404 page not found.

at src/modules/session/Session.spec.ts:12:29
at step (src/modules/session/Session.spec.ts:33:23)
at Object.next (src/modules/session/Session.spec.ts:14:53)
at fulfilled (src/modules/session/Session.spec.ts:5:58)

console.log
Error: Cannot inject the dependency at position #0 of "CreateSession" constructor. Reason:
No repository for "User" was found. Looks like this entity is not registered in current "default" connection?
at C:\Users\gleys\projects\jejconceitonode_modules\tsyringe\dist\cjs\dependency-container.js:209:23
at Array.map ()
at InternalDependencyContainer.construct (C:\Users\gleys\projects\jejconceitonode_modules\tsyringe\dist\cjs\dependency-container.js:195:34)
at InternalDependencyContainer.resolve (C:\Users\gleys\projects\jejconceitonode_modules\tsyringe\dist\cjs\dependency-container.js:81:25)
at SessionController. (C:\Users\gleys\projects\jejconceito\src\modules\session\controller\SessionController.ts:9:44)
at step (C:\Users\gleys\projects\jejconceito\src\modules\session\controller\SessionController.ts:33:23)
at Object.next (C:\Users\gleys\projects\jejconceito\src\modules\session\controller\SessionController.ts:14:53)
at C:\Users\gleys\projects\jejconceito\src\modules\session\controller\SessionController.ts:8:71
at new Promise ()

This is my code:

/* eslint-disable @typescript-eslint/camelcase */
import '@shared/infra/typeorm';
import request from 'supertest';
import app from '@shared/infra/http/app';

describe('Authentication', () => {
  it('should authenticate with valid credentials', async () => {
    const response = await request(app).post('/session').send({
      login: 'email',
      password: 'sss',
    });
    expect(response.status).toBe(200);
  });
});

Most helpful comment

The error happened because connection not initialized yet so create a async await connection and now works fine.

All 9 comments

The error happened because connection not initialized yet so create a async await connection and now works fine.

Could you please write your example? I'm facing the same issue. Thanks!

Could you please write your example? I'm facing the same issue. Thanks!

I changed my connection to async/await, like this:

const connection = async (name = 'default'): Promise<Connection> => {
  return createConnection(
    Object.assign(ormConfig, {
      name,
    }),
  );
};
export default connection;

And changed my tests to:

import createConnection from '@shared/infra/typeorm';
import { Connection, getConnection } from 'typeorm';
let connection: Connection;

describe('Tests', () => {
  beforeAll(async () => {
    connection = await createConnection();
  });

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

 it('should be anything', async () => {
  //TODO
});

});

This way I can solve the connection problem with the tests.

This worked perfectly to me! Thank you @gleysonabreu !

@gleysonabreu pode mostrar o formato do seu ormConfig ? Tentei da forma que comentou porém continuo com problemas, agora retorna o seguinte erro:
image

@gleysonabreu pode mostrar o formato do seu ormConfig ? Tentei da forma que comentou porém continuo com problemas, agora retorna o seguinte erro:
image

@gdlopes Meu código do ORM eu fiz com typescript:

import { ConnectionOptions } from 'typeorm';
import dotenv from 'dotenv';

dotenv.config({
  path: process.env.NODE_ENV === 'development' ? '.env.development' : '.env',
});

const ormConfig: ConnectionOptions = {
  type: 'postgres',
  host: process.env.TYPEORM_HOST,
  port: Number(process.env.TYPEORM_PORT),
  username: process.env.TYPEORM_USERNAME,
  password: process.env.TYPEORM_PASSWORD,
  database: process.env.TYPEORM_DATABASE,
  synchronize: process.env.TYPEORM_SYNCHRONIZE === 'true',
  logging: process.env.TYPEORM_LOGGING === 'true',
  entities: [String(process.env.TYPEORM_ENTITIES)],
  migrations: [String(process.env.TYPEORM_MIGRATIONS)],

  cli: {
    migrationsDir: process.env.TYPEORM_MIGRATIONS_DIR,
  },
};

export = ormConfig;

As variáveis de ambiente são:

# TYPEORM
TYPEORM_CONNECTION=postgres
TYPEORM_HOST=localhost
TYPEORM_USERNAME=postgres
TYPEORM_PASSWORD=password
TYPEORM_PORT=5432
TYPEORM_SYNCHRONIZE=false
TYPEORM_LOGGING=false
TYPEORM_DATABASE=password
TYPEORM_ENTITIES=./src/modules/**/infra/typeorm/entities/*.ts
TYPEORM_MIGRATIONS=./src/shared/infra/typeorm/migrations/*.ts
TYPEORM_MIGRATIONS_DIR=./src/shared/infra/typeorm/migrations

Cara, muito estranho, fiz exatamente dessa forma mas o erro continua:

image

Porém se eu deixar assim, funciona:

import "reflect-metadata";
import { createConnection } from 'typeorm';

createConnection();

O problema é que dessa forma está dando erro nos testes de integração. Mas a aplicação em si funciona perfeitamente.

Tem ideia do que pode ser @gleysonabreu ?

Cara, muito estranho, fiz exatamente dessa forma mas o erro continua:

image

Porém se eu deixar assim, funciona:

import "reflect-metadata";
import { createConnection } from 'typeorm';

createConnection();

O problema é que dessa forma está dando erro nos testes de integração. Mas a aplicação em si funciona perfeitamente.

Tem ideia do que pode ser @gleysonabreu ?

@gdlopes o problema que eu estava tendo era justamente esse funcionava normal mas com os testes não funcionava e como resolvi foi transformar a conexão em async/await e coloca o método beforeAll como async await e importar a conexão em cada arquivo de teste e resolveu meu problema. Dei uma pesquisa aqui agora para vê se encontrava algo novo sobre mas não achei nada de útil relacionado ao problema.

e necessario importar o container no primeiro arquivo da sua aplicacao

ex: import "./shared/container"

Was this page helpful?
0 / 5 - 0 ratings