我在 GitHub CI 中遇到某些 Jest 测试的问题。我的项目在 TypeScript 中,所以我使用的是 ts-jest。这是我正在测试的函数,它设置日期和时间元素的“文本”字段:
const months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
const days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
export const setDateAndTime = (dateDisplay: TextElement, clockDisplay: TextElement): void => {
let now: Date = new Date(Date.now());
dateDisplay.text = `${days[now.getDay()]}, ${months[now.getMonth()]} ${now.getDate()}, ${now.getFullYear()}`;
let hours: number = preferences.clockDisplay === "12h" ? now.getHours() % 12 || 12 : now.getHours();
let minutes: number = now.getMinutes();
clockDisplay.text = minutes < 10 ? `${hours}:0${minutes}` : `${hours}:${minutes}`;
};
这是对该函数的测试:
import { TestElement } from "../mocks/test-element";
let dateDisplay = new TestElement() as TextElement;
let clockDisplay = new TestElement() as TextElement;
test("Sets date and time display correctly", () => {
jest.spyOn(Date, "now").mockImplementation(() => 1607913488);
setDateAndTime(dateDisplay, clockDisplay);
expect(dateDisplay.text).toBe("Mon, Jan 19, 1970");
expect(clockDisplay.text).toBe("9:38");
});
TestElement 只是一个带有“文本”字段的虚拟元素:
export class TestElement {
text = "";
}
在本地,两个expect() 语句都通过。但是,在 GitHub 中,我收到以下错误,仅针对 second 语句:
TypeError: (0 , _jestDiff.diffStringsRaw) is not a function
18 | setDateAndTime(dateDisplay, clockDisplay);
19 | expect(dateDisplay.text).toBe("Mon, Jan 19, 1970");
> 20 | expect(clockDisplay.text).toBe("9:38");
| ^
21 | });
由于该问题仅发生在 GitHub 中,因此我也会发布我的 node.js.yml 配置:
name: Node.js CI
on: [push]
jobs:
build:
runs-on: windows-latest
strategy:
matrix:
node-version: [14.x]
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- run: npm ci
- run: npx fitbit-build
- run: npm test
在我的一生中,我无法弄清楚为什么只有第二个字符串比较失败 - 它是在完全相同的元素类上执行的完全相同的功能。在做了一些研究之后,我唯一能找到的是 diffStringsRaw 是 Jest 通过 jest-diff 包在内部使用的,但我没有得到更多。任何帮助将不胜感激!
答案 0 :(得分:0)
这个问题的答案根本不在 Jest 中 - 而是 GitHub 测试运行器在 GMT 中运行,而不是本地时区,这就是为什么第一个 expect() 通过比较日期,而第二个一个比较时间失败。
对于任何感兴趣的人,可能的解决方案是:
我选择了选项 2 并选择了 Setup Timezone(为了易于使用的操作而大喊zcong1993!)