ladjs / supertest

🕷 Super-agent driven library for testing node.js HTTP servers using a fluent API. Maintained for @forwardemail, @ladjs, @spamscanner, @breejs, @cabinjs, and @lassjs.
MIT License
13.82k stars 759 forks source link

Cannot inject the dependency at position #0 of #666

Closed gleysonabreu closed 4 years ago

gleysonabreu commented 4 years ago

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\jejconceito\node_modules\tsyringe\dist\cjs\dependency-container.js:209:23 at Array.map () at InternalDependencyContainer.construct (C:\Users\gleys\projects\jejconceito\node_modules\tsyringe\dist\cjs\dependency-container.js:195:34) at InternalDependencyContainer.resolve (C:\Users\gleys\projects\jejconceito\node_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);
  });
});
gleysonabreu commented 4 years ago

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

thauam09 commented 3 years ago

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

gleysonabreu commented 3 years ago

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.

thauam09 commented 3 years ago

This worked perfectly to me! Thank you @gleysonabreu !

gdlopes commented 3 years ago

@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 commented 3 years ago

@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
gdlopes commented 3 years ago

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 ?

gleysonabreu commented 3 years ago

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.

JunioResende commented 3 years ago

e necessario importar o container no primeiro arquivo da sua aplicacao

ex: import "./shared/container"

SamuelB7 commented 3 years ago

e necessario importar o container no primeiro arquivo da sua aplicacao

ex: import "./shared/container"

@JunioResende Funcionou aqui. Valeu!

Gabriel-Aquino commented 3 years ago

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.

Opa, Gleyson, beleza? Cara, poderia exemplificar melhor como você resolveu esse problema? Pra mim ta da mesma forma: consigo executar normalmente a aplicação mas ao tentar executar os testes, ocorre o erro da injeção de dependencia.

Eu tentei aplicar o que foi dito mais acima por você e os demais mas não deu certo. Creio que possa estar fazendo alguma coisa coisa errada ao tentar replicar a solução. Após aplicar tudo, continuou rodando a aplicação mas o teste novamente não funciona. O erro que ocorre ao executar os testes é: CannotExecuteNotConnectedError: Cannot execute operation on "default" connection because connection is not yet established.

Se você souber o que pode ser, lhe agradeceria muito. Queria também entender onde fica o seu arquivo ormconfig.ts (a nivel de diretório e o código), o seu index de da pasta shared, como ta o codigo completo e os demais arquivos dos códigos postados anteriormente.

De já te agradeço demais!

Gabriel-Aquino commented 3 years ago

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.

Opa, Gleyson, beleza? Cara, poderia exemplificar melhor como você resolveu esse problema? Pra mim ta da mesma forma: consigo executar normalmente a aplicação mas ao tentar executar os testes, ocorre o erro da injeção de dependencia.

Eu tentei aplicar o que foi dito mais acima por você e os demais mas não deu certo. Creio que possa estar fazendo alguma coisa coisa errada ao tentar replicar a solução. Após aplicar tudo, continuou rodando a aplicação mas o teste novamente não funciona. O erro que ocorre ao executar os testes é: CannotExecuteNotConnectedError: Cannot execute operation on "default" connection because connection is not yet established.

Se você souber o que pode ser, lhe agradeceria muito. Queria também entender onde fica o seu arquivo ormconfig.ts (a nivel de diretório e o código), o seu index de da pasta shared, como ta o codigo completo e os demais arquivos dos códigos postados anteriormente.

De já te agradeço demais!

Fiz algumas alterações aqui no código e funcionou!

no arquivo ormconfig.ts eu alterei para:

dotenv.config({ path: '.env.development', }); Creio que terei que alterar no código quando quiser utilizar o .env

No meu arquivo de testes, eu comentei a linha onde tem await connection.close(), dentro do AfterAll(). Deu certo, não apresentou mais o erro no código, o teste passou e está armazenando no banco normalmente!

Muito obrigado, @gleysonabreu pela solução compartilhada!

gleysonabreu commented 3 years ago

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.

Opa, Gleyson, beleza? Cara, poderia exemplificar melhor como você resolveu esse problema? Pra mim ta da mesma forma: consigo executar normalmente a aplicação mas ao tentar executar os testes, ocorre o erro da injeção de dependencia.

Eu tentei aplicar o que foi dito mais acima por você e os demais mas não deu certo. Creio que possa estar fazendo alguma coisa coisa errada ao tentar replicar a solução. Após aplicar tudo, continuou rodando a aplicação mas o teste novamente não funciona. O erro que ocorre ao executar os testes é: CannotExecuteNotConnectedError: Cannot execute operation on "default" connection because connection is not yet established.

Se você souber o que pode ser, lhe agradeceria muito. Queria também entender onde fica o seu arquivo ormconfig.ts (a nivel de diretório e o código), o seu index de da pasta shared, como ta o codigo completo e os demais arquivos dos códigos postados anteriormente.

De já te agradeço demais!

Já faz tempo que diz aquilo e nem tenho mais o código. Mas eu fui no seu perfil do Github e vi seu projeto e clonei ele aqui para da uma olhada!! Fiz algumas modificações nele para os tests de integração funcionarem e vou listar abaixo:

Primeiramente fui no arquivo de conexão do typeorm e modifiquei para:

export default async () => createConnection();

Após isso fui no arquivo app e troquei a importação da conexão e instanciei ela:

import connection from '../typeorm';
connection();

E a partir de agora eu uso duas opções para instanciar as conexões nos tests, a primeira é: você ir em cada test de integração e adicionar o código:

import { Connection } from 'typeorm';
import connect from '@shared/infra/typeorm';

let connection: Connection;
describe(.........)........ {

beforeAll(async () => {
  connection = await connect();
});

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

}

Ou a segunda é você criar um arquivo jest.setup.ts na raiz do projeto para o jest importar esse arquivo e instanciar a conexão mas você vai ter que está com banco de dados de ligado tanto para tests de integração quanto para os tests de unitários etc.. jest.setup.ts:

import { Connection } from 'typeorm';
import connect from '@shared/infra/typeorm';

let connection: Connection;
beforeAll(async () => {
  connection = await connect();
});

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

e no jest.config.js você adiciona:

setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],

Ao fazer isso e executar todos os tests passaram.

Test Suites: 7 passed, 7 total
Tests:       12 passed, 12 total
Snapshots:   0 total
Time:        5.166 s, estimated 10 s
Gabriel-Aquino commented 3 years ago

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.

Opa, Gleyson, beleza? Cara, poderia exemplificar melhor como você resolveu esse problema? Pra mim ta da mesma forma: consigo executar normalmente a aplicação mas ao tentar executar os testes, ocorre o erro da injeção de dependencia. Eu tentei aplicar o que foi dito mais acima por você e os demais mas não deu certo. Creio que possa estar fazendo alguma coisa coisa errada ao tentar replicar a solução. Após aplicar tudo, continuou rodando a aplicação mas o teste novamente não funciona. O erro que ocorre ao executar os testes é: CannotExecuteNotConnectedError: Cannot execute operation on "default" connection because connection is not yet established. Se você souber o que pode ser, lhe agradeceria muito. Queria também entender onde fica o seu arquivo ormconfig.ts (a nivel de diretório e o código), o seu index de da pasta shared, como ta o codigo completo e os demais arquivos dos códigos postados anteriormente. De já te agradeço demais!

Já faz tempo que diz aquilo e nem tenho mais o código. Mas eu fui no seu perfil do Github e vi seu projeto e clonei ele aqui para da uma olhada!! Fiz algumas modificações nele para os tests de integração funcionarem e vou listar abaixo:

Primeiramente fui no arquivo de conexão do typeorm e modifiquei para:

export default async () => createConnection();

Após isso fui no arquivo app e troquei a importação da conexão e instanciei ela:

import connection from '../typeorm';
connection();

E a partir de agora eu uso duas opções para instanciar as conexões nos tests, a primeira é: você ir em cada test de integração e adicionar o código:

import { Connection } from 'typeorm';
import connect from '@shared/infra/typeorm';

let connection: Connection;
describe(.........)........ {

beforeAll(async () => {
  connection = await connect();
});

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

}

Ou a segunda é você criar um arquivo jest.setup.ts para o jest importar esse arquivo e instanciar a conexão mas você vai ter que está com banco de dados de ligado tanto para tests de integração quanto para os tests de unitários etc.. jest.setup.ts:

import { Connection } from 'typeorm';
import connect from '@shared/infra/typeorm';

let connection: Connection;
beforeAll(async () => {
  connection = await connect();
});

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

e no jest.config.js você adiciona:

setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],

Ao fazer isso e executar todos os tests passaram.

Test Suites: 7 passed, 7 total
Tests:       12 passed, 12 total
Snapshots:   0 total
Time:        5.166 s, estimated 10 s

Beleza irmão, muito obrigado!

Vou tentar dessa forma que você me explicou também aqui. Obrigado mesmo!