【问题标题】:How to cover TypeORM @Column decorator with Jest unit testing?如何用 Jest 单元测试覆盖 TypeORM @Column 装饰器?
【发布时间】: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

【问题讨论】:

    标签: typescript unit-testing jestjs nestjs typeorm


    【解决方案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 heremy 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 的更新。这足以让我找到适合我的情况的解决方案。
      猜你喜欢
      • 2020-04-24
      • 2013-03-19
      • 2019-12-04
      • 2021-08-08
      • 2020-12-04
      • 2016-12-30
      • 2011-03-02
      • 1970-01-01
      相关资源
      最近更新 更多