開玩笑(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 報告