如何在 TypeScript 中使用 Jest 和 Knex 进行测试?
Posted
技术标签:
【中文标题】如何在 TypeScript 中使用 Jest 和 Knex 进行测试?【英文标题】:How to do testing with Jest and Knex in TypeScript? 【发布时间】:2020-01-23 10:28:39 【问题描述】:我正在尝试使用 Jest 和 Knex 测试 GraphQL 服务器。我很难弄清楚如何在打字稿中使用 knexfile。但现在,除了测试之外,开发和生产环境一切正常。
这是我目前的knexfile.ts
:
// knexfile.ts
const defaults =
client: 'pg',
connection:
host: DB_HOST,
user: DB_USER,
password: DB_PASSWORD,
database: DB_DATABASE
,
pool:
min: 2,
max: 10
,
migrations:
extension: 'ts',
directory: './migration',
tableName: 'knex_migrations'
,
seeds:
extension: 'ts',
directory: './seed'
;
interface KnexConfig
[key: string]: object;
const knexConfig: KnexConfig =
local:
client: 'sqlite3',
connection:
filename: './dev.sqlite3'
,
development:
...defaults,
debug: true,
useNullAsDefault: true
,
production:
...defaults
;
/**
* `export default` does not work, causes `client` missing problem
* at database migration.
*/
export = knexConfig;
这是 Jest 的全局设置:
// globalSetup.ts
export = async () =>
try
// Start http server
await httpServer.listen(PORT);
// Rollback and migrate
// await knex.migrate.rollback().then(() => knex.migrate.latest());
knex.migrate.latest();
catch (err)
// Log the error
logger.error('', err);
;
这是全局拆解:
// globalTeardown.ts
export = async () =>
try
await knex.migrate.rollback();
// Shutdown server
httpServer.close(() => logger.info('Server closed'));
catch (err)
// Log the error
logger.error('', err);
;
它一直给我错误:
Unhandled rejection SyntaxError: Unexpected token *
/home/my/knex-graphql/migration/20190821235716_create_user.ts:1
import * as Knex from 'knex';
^
SyntaxError: Unexpected token *
at Module._compile (internal/modules/cjs/loader.js:872:18)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:947:10)
at Module.load (internal/modules/cjs/loader.js:790:32)
at Function.Module._load (internal/modules/cjs/loader.js:703:12)
at Function.<anonymous> (/home/my/knex-graphql/node_modules/@sentry/node/src/integrations/console.ts:37:43)
at Function._load (/home/my/knex-graphql/node_modules/@sentry/node/src/integrations/http.ts:73:43)
at Module.require (internal/modules/cjs/loader.js:830:19)
at require (internal/modules/cjs/helpers.js:68:18)
at FsMigrations.getMigration (/home/my/knex-graphql/node_modules/knex/lib/migrate/sources/fs-migrations.js:84:12)
at /home/my/knex-graphql/node_modules/knex/lib/migrate/Migrator.js:82:69
at arrayFilter (/home/my/knex-graphql/node_modules/lodash/lodash.js:582:11)
at filter (/home/my/knex-graphql/node_modules/lodash/lodash.js:9173:14)
at /home/my/knex-graphql/node_modules/knex/lib/migrate/Migrator.js:81:13
at tryCatcher (/home/my/knex-graphql/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/home/my/knex-graphql/node_modules/bluebird/js/release/promise.js:517:31)
at Promise._settlePromise (/home/my/knex-graphql/node_modules/bluebird/js/release/promise.js:574:18)
From previous event:
at Migrator.latest (/home/my/knex-graphql/node_modules/knex/lib/migrate/Migrator.js:71:8)
at /home/my/knex-graphql/test/global/setup.ts:24:32
at Generator.next (<anonymous>)
at fulfilled (/home/my/knex-graphql/test/global/setup.ts:5:58)
at processTicksAndRejections (internal/process/task_queues.js:85:5)
技术栈:Apollo-server-express、TypeScript、Knex.js、PostgreSQL、Jest
【问题讨论】:
我突然遇到同样的错误,您最终找到解决方案了吗? 【参考方案1】:您需要添加ts-jest,它会转译您的 ts 文件以供开玩笑。 安装它
npm install --save-dev ts-jest
添加默认 ts-jest 配置
npx ts-jest config:init
【讨论】:
【参考方案2】:我们在knexfile.js
中使用了类似的东西
require('ts-node/register');
require('dotenv').config();
const
SERVER_HOST,
SERVER_USER,
SERVER_PASSWORD,
SERVER_DATABASE,
SERVER_DATABASE_TEST,
= process.env;
【讨论】:
以上是关于如何在 TypeScript 中使用 Jest 和 Knex 进行测试?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 jest.fn() 在 jest 中使用 typescript 模拟函数
如何使用 Typescript 将 jest.spyOn 与 React 函数组件一起使用
如何在没有冲突的情况下将 Mocha 和 Jest 与 TypeScript 一起使用?
如何在 Jest 的自定义测试环境文件中使用 TypeScript?