我想尽可能地对我的应用程序进行单元测试和e2e测试,我的目标是覆盖率达到101%。我的安装程序现在遇到的问题是,来自typeorm的@Column装饰器使用箭头功能来设置默认值,例如数据库更新时的当前时间戳。笑话测试范围未涵盖此箭头功能。消息是:statement not covered
我使用以下代码运行代码覆盖率:jest --coverage
。
我的版本:
"jest": "^24.9.0",
"typeorm": "^0.2.20"
package.json中的最佳配置:
{
"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
答案 0 :(得分:1)
我遇到了与GraphQL装饰器类似的问题。由于所有这些都是函数,因此您可以做的是创建一个文件,其中包含您将要使用的所有功能,命名它们并导出它们,以便您实际上也可以对其进行测试并获得Jest的覆盖率。 (测试的字面意义应该类似于expect(namedFunction).toBe('CURRENT_TIMESTAMP()')
或非常相似。例如you can see my function here和my tests here。
答案 1 :(得分:0)
基于@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'
})