gpt4 book ai didi

javascript - 在 jest globalSetup 中创建连接时找不到 Typeorm 连接 "default"

转载 作者:行者123 更新时间:2023-12-05 00:37:27 26 4
gpt4 key购买 nike

我遇到了与 #5164 中类似的问题和 this question .考虑以下工作测试代码:

// AccountResolver.test.ts
describe('Account entity', () => {
it('add account', async () => {
await createConnections()
const defaultConnection = getConnection('default')

const actual = await callGraphql(
`mutation {
addAccount(options: {
accountIdentifier: "7csdcd8-8a5f-49c3-ab9a-0198d42dd253"
name: "Jake, Bob (Braine-l’Alleud) JAM"
userName: "Bob.Marley@contoso.com"
}) {
accountIdentifier
name
userName
}
}`
)
expect(actual.data).toMatchObject({
data: {
addAccount: {
accountIdentifier: '7csdcd8-8a5f-49c3-ab9a-0198d42dd253',
name: 'Jake, Bob (Braine-l’Alleud) JAM',
userName: 'Bob.Marley@contoso.com',
},
},
})

await defaultConnection.query(`DELETE FROM Account`)
await defaultConnection.close()
})
})

创建连接并关闭它的代码应该在所有测试之前和所有测试完成之后执行,这就是我们将它添加到 globalSetup.ts 的原因和 globalTeardown.ts :

// globalSetup.ts
require('ts-node/register')
import { createConnections } from 'typeorm'

module.exports = async () => {
// console.log('jest setup')
await createConnections()
}

// globalTeardown.ts
require('ts-node/register')
import { getConnection } from 'typeorm'

module.exports = async () => {
const defaultConnection = getConnection('default')
await defaultConnection.close()
}

// AccountResolver.test.ts
describe('Account entity', () => {
it('add account', async () => {
const defaultConnection = getConnection('default')
await defaultConnection.query(`DELETE FROM Account`)

const actual = await callGraphql(
`mutation {
addAccount(options: {
accountIdentifier: "7csdcd8-8a5f-49c3-ab9a-0198d42dd253"
name: "Jake, Bob (Braine-l’Alleud) JAM"
userName: "Bob.Marley@contoso.com"
}) {
accountIdentifier
name
userName
}
}`
)
expect(actual.data).toMatchObject({
data: {
addAccount: {
accountIdentifier: '7csdcd8-8a5f-49c3-ab9a-0198d42dd253',
name: 'Jake, Bob (Braine-l’Alleud) JAM',
userName: 'Bob.Marley@contoso.com',
},
},
})
})
})

省略行 require('ts-node/register')从这两个文件都会引发此错误:

T:\Test\src\it-portal\entity\Account.ts:1 import { ^^^^^^ SyntaxError: Cannot use import statement outside a module



保留 require throw 线:

FAIL src/resolvers/AccountResolver.test.ts × add account (31 ms) ● Account entity › add account ConnectionNotFoundError: Connection "default" was not found.Account entity



版本
    "jest": "^26.0.1",
"ts-jest": "^26.1.0",
"ts-node-dev": "^1.0.0-pre.44",
"typescript": "^3.9.5"

配置

// jest.config.js
module.exports = {
preset: 'ts-jest',
globalSetup: './src/test-utils/config/globalSetup.ts',
globalTeardown: './src/test-utils/config/globalTeardown.ts',
setupFiles: ['./src/test-utils/config/setupFiles.ts'],
moduleDirectories: ['node_modules', 'src'],
globals: {
'ts-jest': {
tsConfig: 'tsconfig.json',
diagnostics: {
warnOnly: true,
},
},
},
coverageThreshold: {
global: {
branches: 80,
functions: 80,
lines: 80,
statements: 80,
},
},
coverageReporters: ['json', 'lcov', 'text', 'clover'],
}

谢谢你指出我的错误。由于我是新手,所以我尝试使用谷歌搜索,但如果这是我不了解该工具或其中的错误,则无法真正找到答案。发现类似问题 herePR .

似乎测试在完全隔离的环境中运行,它们无法访问在 globalSetup 中设置的连接。 .

解决方法

到目前为止,我发现的唯一解决方法是将以下代码添加到每个测试文件中:

beforeAll(async () => {
await createConnections()
})

afterAll(async () => {
const defaultConnection = getConnection('default')
await defaultConnection.close()
})

最佳答案

require('ts-node/register')不应出现在 .ts 文件中。它们已经由 TypeScript 编译器处理。

这不是 globalSetupglobalTeardown是给。它们在 Jest 父进程中运行并被评估一次,而每个测试套件在子进程中运行。

这可以通过在 setupFilesAfterEnv 中提供通用设置来实现。选项:

// jest.setup.ts
...
beforeAll(async () => {
await createConnections()
})

afterAll(async () => {
const defaultConnection = getConnection('default')
await defaultConnection.close()
})

由于 Jest 测试并行运行,这将导致多个数据库连接。如果由于连接限制而不可取,Jest runInBand需要使用选项。

所有测试的设置都不可取,因为并非所有测试套件都需要数据库连接,而它们将无条件地占用时间并占用数据库连接池。在这种情况下,jest.setup.ts 可以直接导入使用数据库而不是 setupFilesAfterEnv 的测试中。 ,无需指定 beforeAllafterAll在每个套房。

关于javascript - 在 jest globalSetup 中创建连接时找不到 Typeorm 连接 "default",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62470047/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com