TypeORM在使用Supertest测试Express应用程序时无法找到连接



我正在构建一个TypeScript Node.js/Express应用程序,并开始使用Jest和Supertest实现一些集成测试,但即使在成功设置了一个TypeORM连接后,我的测试也失败了,说没有找到连接。

这是我目前在我的测试文件中的内容:

let conn: Connection;
describe('tests admin routes', () => {
beforeAll(async () => {
conn = await createConnection();
registerDeps(); // registers dependencies on my tsyringe container
});
afterAll(async () => {
await conn.close();
});
it('should be able to authenticate admins', async () => {
const { status } = await supertest(app) // app is an `Express` "instance"
.post('/admins/auth')
.send({
email: 'myemail@company.com',
password: 'mypassword',
});
console.log(status);
});
});

如果我在我的终端上运行jest,我得到以下内容:

FAIL  src/modules/admin/web/controllers/__tests__/AdminsController.spec.ts
● Test suite failed to run
ConnectionNotFoundError: Connection "default" was not found.
at new ConnectionNotFoundError (src/error/ConnectionNotFoundError.ts:8:9)
at ConnectionManager.Object.<anonymous>.ConnectionManager.get (src/connection/ConnectionManager.ts:40:19)
at Object.getRepository (src/index.ts:284:35)
at new VideosRepositoryTORM (src/modules/course/infrastructure/lib/typeorm/repositories/VideosRepositoryTORM.ts:11:26)
at Object.<anonymous> (src/modules/course/web/controller/CoursesController.ts:12:26)
at Object.<anonymous> (src/modules/course/web/routers/courses.router.ts:5:1)
Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        3.89 s
Ran all test suites.

我有点困惑,因为我的控制器调用的所有服务都没有使用VideosRepositoryTORM,如果我使用conn来解决存储库,例如做conn.getRepository(Admin)(Admin是一个TypeORM实体),然后调用任何Repository方法,如findquery,它实际上返回存储在数据库上的数据,这使我相信我的连接确实建立并且正在工作。

另外,当使用node运行时,我的应用程序工作正常,它只是在测试中输出此连接错误。值得一提的是,我正在使用tsyringe将存储库实现注入到我的服务中,但我不认为这是导致问题的原因。有人知道这里会发生什么吗?

我的'ormconfig.js'文件上有两个连接:

module.exports = [
{
name: 'default',
type: 'postgres',
// ...
},
{
name: 'test',
type: 'postgres',
// ...
},
];

并且,如果没有被告知,typeorm总是尝试与'default'连接做一些事情。例如,用getRepository(Teacher)加载实体存储库等同于getRepository(Teacher, 'default')。因此,typeorm实际上正在创建连接,但当我运行集成测试时,它试图使用'default'而不是'test'

当你使用多个连接时,你可以做一些事情来解决这个问题:

  1. 硬编码每次要使用的连接(这在大多数情况下不会很好地工作);

  2. 设置环境变量并使用它们来选择您想要的连接(这是最灵活的选项);

  3. 加载所需的连接配置并"重命名";在创建连接时,将其设置为'default',或者您可能使用的任何其他名称。

在我的例子中,我选择了第三个选项,所以我在测试中添加了以下内容:

beforeAll(async () => {
const connOpts = await getConnectionOptions('test');
conn = await createConnection({ ...connOpts, name: 'default' });
// ...
});

如果要使用两个以上的连接,第二个选项可能更好,但第三个选项也可以。这完全由你来决定。

相关内容

  • 没有找到相关文章

最新更新