如何用Jest单元测试覆盖TypeORM@Column装饰器



我想尽可能多地对我的应用程序进行单元和e2e测试,我的目标是覆盖率达到101%。我的设置现在的问题是,typeorm中的@Column装饰器使用箭头函数来设置默认值,比如数据库更新中的当前时间戳。此箭头函数不包含在jest测试覆盖范围内。消息为: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

我在GraphQL装饰器中遇到了类似的问题。由于所有这些都是函数,您可以创建一个文件,其中包含您将要使用的所有函数,命名并导出它们,这样您就可以实际测试它们,并使用Jest获得覆盖范围。(测试应该是类似于expect(namedFunction).toBe('CURRENT_TIMESTAMP()')或非常相似的东西。例如,你可以在这里看到我的函数和我的测试。

编辑日期:2020年3月11日

代码示例不多了。话虽如此,你可以做这样的事情

export const returnString = () => String;
@Query(returnString)

GraphQL。对此的测试看起来像

expect(returnString()).toBe(String);

这是基于@JayMcDonnell的答案为我提供的解决方案。

  • 数据库类型: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'
})

最新更新