Jest测试在本地通过,但为什么在GitHub操作中运行npm测试时会失败



我在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中,我得到了以下错误,仅针对第二个语句:

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包在内部使用的,但我还没有得到更多。任何帮助都将不胜感激!

如果您不想使用GitHub Action,另一种解决方法是将test命令替换为TZ=Europe/London npm test,其中欧洲/伦敦是您想要的时区。

有关的讨论,请参阅此链接

答案根本不在Jest中,而是GitHub测试运行程序在GMT运行,而不是在本地时区,这就是为什么第一个expect((在比较日期时通过,第二个在比较时间时失败的原因。

对于任何感兴趣的人来说,可能的解决方案是:

  1. 重构函数或测试以考虑系统时区;或
  2. 在您的配置中添加一个GitHub操作,该操作明确设置时区

我选择了选项2,并使用设置时区(大喊zcong1993,以获得易于使用的操作!(

最新更新