開玩笑(ts-jest)

jest 是 Facebook 的無痛 JavaScript 測試框架, ts-jest 可用於測試 TypeScript 程式碼。

使用 npm run 命令安裝 jest

npm install --save-dev jest @types/jest ts-jest typescript

為了便於使用,請將 jest 安裝為全域性包

npm install -g jest

要使 jest 與 TypeScript 一起使用,你需要向 package.json 新增配置

//package.json
{
...
"jest": {
    "transform": {
      ".(ts|tsx)": "<rootDir>/node_modules/ts-jest/preprocessor.js"
    },
    "testRegex": "(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$",
    "moduleFileExtensions": ["ts", "tsx", "js"]
  }
}

現在 jest 準備好了。假設我們有樣品 fizz buz 來測試

//fizzBuzz.ts
export function fizzBuzz(n: number): string {
    let output = "";
    for (let i = 1; i <= n; i++) {
        if (i % 5 && i % 3) {
            output += i + ' ';
        }
        if (i % 3 === 0) {
            output += 'Fizz ';
        }
        if (i % 5 === 0) {
            output += 'Buzz ';
        }
    }
    return output;
}

示例測試可能看起來像

//FizzBuzz.test.ts
/// <reference types="jest" />

import {fizzBuzz} from "./fizzBuzz";
test("FizzBuzz test", () =>{
    expect(fizzBuzz(2)).toBe("1 2 ");
    expect(fizzBuzz(3)).toBe("1 2 Fizz ");
});

執行測試執行

jest

在輸出中你應該看到

 PASS  ./fizzBuzz.test.ts
  ✓ FizzBuzz test (3ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        1.46s, estimated 2s
Ran all test suites.

程式碼覆蓋率

jest 支援生成程式碼覆蓋率報告。

要使用 TypeScript 進行程式碼覆蓋,你需要向 package.json 新增另一個配置行。

{
...
  "jest": {
  ...
    "testResultsProcessor": "<rootDir>/node_modules/ts-jest/coverageprocessor.js"
  }
}

執行生成覆蓋率報告的測試執行

jest --coverage

如果與我們的樣本嘶嘶聲一起使用你應該看到

 PASS  ./fizzBuzz.test.ts
  ✓ FizzBuzz test (3ms)

-------------|----------|----------|----------|----------|----------------|
File         |  % Stmts | % Branch |  % Funcs |  % Lines |Uncovered Lines |
-------------|----------|----------|----------|----------|----------------|
All files    |    92.31 |     87.5 |      100 |    91.67 |                |
 fizzBuzz.ts |    92.31 |     87.5 |      100 |    91.67 |             13 |
-------------|----------|----------|----------|----------|----------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        1.857s
Ran all test suites.

jest 還建立了資料夾 coverage,其中包含各種格式的覆蓋報告,包括 coverage/lcov-report/index.html 中的使用者友好的 html 報告

StackOverflow 文件