如何用 Jest 单元测试覆盖 TypeORM @Column 装饰器?
Posted
技术标签:
【中文标题】如何用 Jest 单元测试覆盖 TypeORM @Column 装饰器?【英文标题】:How to cover TypeORM @Column decorator with Jest unit testing? 【发布时间】:2020-03-03 22:47:33 【问题描述】:我想尽可能多地对我的应用程序进行单元和 e2e 测试,我的目标是 101% 的覆盖率。我的设置现在的问题是,来自 typeorm 的 @Column 装饰器使用箭头函数来设置默认值,例如数据库更新的当前时间戳。此箭头函数未包含在开玩笑测试覆盖范围内。留言是:statement not covered
我运行代码覆盖率:jest --coverage
。
我的版本:
"jest": "^24.9.0",
"typeorm": "^0.2.20"
package.json 中的 Jest 配置:
"jest":
"moduleFileExtensions": [
"js",
"json",
"ts"
],
"rootDir": "src",
"testRegex": ".spec.ts$",
"transform":
"^.+\\.(t|j)s$": "ts-jest"
,
"coverageDirectory": "../build/coverage",
"testEnvironment": "node",
"coverageThreshold":
"global":
"branches": 80,
"functions": 80,
"lines": 80,
"statements": -10
,
我的实体如下所示:
import Column, Entity, PrimaryGeneratedColumn from 'typeorm';
@Entity()
export class Role
@PrimaryGeneratedColumn()
id: number;
@Column()
tenantId: number;
@Column( type: 'timestamp', update: false, default: () => 'CURRENT_TIMESTAMP()' )
createdAt: Date;
@Column( type: 'timestamp', default: () => 'CURRENT_TIMESTAMP()', onUpdate: 'CURRENT_TIMESTAMP()' )
updatedAt: Date;
此实体的覆盖范围:
(要发布图片我需要 10 声望 -.-):https://i.ibb.co/FYQgstP/Screenshot-2019-11-07-11-46-45.png
【问题讨论】:
【参考方案1】:根据@JayMcDoniel 的回答,这是对我有用的解决方案。
数据库类型:postgreSQl
测试:jest/chai
函数类:
export abstract class EntityDefaultFunctions
public static defaultNull = (): string => 'NULL';
public static defaultZero = (): string => '0';
测试:
expect(EntityDefaultFunctions.defaultNull()).to.equal('NULL');
expect(EntityDefaultFunctions.defaultZero()).to.equal('0');
示例实体列定义:
@Column('text',
default: EntityDefaultFunctions.defaultNull,
name: 'somePropertyName'
)
【讨论】:
【参考方案2】:我在使用 GraphQL 装饰器时遇到了类似的问题。由于所有这些都是函数,您可以做的是创建一个文件,其中包含您将使用的所有函数、命名并导出它们,以便您也可以实际测试它们并使用 Jest 获取覆盖范围。 (测试实际上应该类似于 expect(namedFunction).toBe('CURRENT_TIMESTAMP()')
或非常相似。例如 you can see my function here 和 my tests here。
编辑 2020 年 11 月 3 日
代码示例不再赘述。话虽如此,你可以做类似的事情
export const returnString = () => String;
@Query(returnString)
对于 GraphQL。对此的测试看起来像
expect(returnString()).toBe(String);
【讨论】:
太棒了。现在覆盖率是 100%,没有那些烦人的“忽略”cmets 唯一剩下的问题是那些新创建的函数缺少返回类型。例如:export const returnString = () => String;
我不能提供 : String
作为返回类型,因为它抱怨缺少 StringConstructor 类型的方法
您应该仍然可以执行expect(returnString()).toBe(String)
之类的操作。我已经在我的测试类中运行没有问题
感谢@JayMcDoniel 的更新。这足以让我找到适合我的情况的解决方案。以上是关于如何用 Jest 单元测试覆盖 TypeORM @Column 装饰器?的主要内容,如果未能解决你的问题,请参考以下文章
如何用 jest 测试此 api 中间件是不是处理 fetch 引发的错误?
如何用 Jest 覆盖 mapDispatchToProps 中的行?
如何使用 Jest 在 TypeORM 中存根 EntityManager 和 Connection
为啥基于 jest 的单元测试现在会导致 0% 的测试覆盖率?