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

时间:2020-12-21 16:51:36

标签: jestjs github-actions ts-jest

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

1 个答案:

答案 0 :(得分:0)

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

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

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

我选择了选项 2 并选择了 Setup Timezone(为了易于使用的操作而大喊zcong1993!)