我在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((在比较日期时通过,第二个在比较时间时失败的原因。
对于任何感兴趣的人来说,可能的解决方案是:
- 重构函数或测试以考虑系统时区;或
- 在您的配置中添加一个GitHub操作,该操作明确设置时区
我选择了选项2,并使用设置时区(大喊zcong1993,以获得易于使用的操作!(