簡體   English   中英

如何用 Jest 單元測試覆蓋 TypeORM @Column 裝飾器?

[英]How to cover TypeORM @Column decorator with Jest unit testing?

我想盡可能多地對我的應用程序進行單元和 e2e 測試,我的目標是 101% 的覆蓋率。 我的設置現在的問題是,來自 typeorm 的 @Column 裝飾器使用箭頭 function 來設置默認值,例如數據庫更新的當前時間戳。 這個箭頭 function 沒有被開玩笑測試覆蓋。 消息是: 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

我在使用 GraphQL 裝飾器時遇到了類似的問題。 由於所有這些都是函數,您可以做的是創建一個文件,其中包含您將使用的所有函數、命名並導出它們,以便您也可以實際測試它們並使用 Jest 獲取覆蓋范圍。 (測試實際上應該類似於expect(namedFunction).toBe('CURRENT_TIMESTAMP()')或非常相似。例如, 您可以在此處查看我的 function 和此處的測試

編輯 2020 年 11 月 3 日

代碼示例不再贅述。 話雖如此,您可以執行以下操作

export const returnString = () => String;

@Query(returnString)

對於 GraphQL。 對此的測試看起來像

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

根據@JayMcDoniel 的回答,這是對我有用的解決方案。

  • 數據庫類型: postgreSQl
  • 測試: jest/chai

功能 class:

  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'
  })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM