jest typescript - 模拟日期构造函数

Ell*_*ski 12 unit-testing mocking spy typescript jestjs

我试图模拟new Date()返回一个特定的日期。以下代码:

const now = new Date()
jest.spyOn(global, 'Date').mockImplementation(() => now)
Run Code Online (Sandbox Code Playgroud)

给出一个编译错误:Argument of type '() => Date' is not assignable to parameter of type '() => string'. Type 'Date' is not assignable to type 'string'

我认为原因是 jest 认为我正在尝试模拟Date()而不是new Date(). 确实,Date()返回一个字符串。我该如何解决这个问题?

小智 10

达林(Daryn)对阿伦(Arron)答案的推理评论效果很好,无需额外的软件包。

const mockDate = new Date();
jest.spyOn(global, "Date").mockImplementation(() => (mockDate as unknown) as string);
const myDate = new Date();
Run Code Online (Sandbox Code Playgroud)


Yuc*_*uci 8

解决方法是使用模拟日期库,它可用于更改“现在”的时间。

\n\n
const MockDate = require(\'mockdate\');\n\ntest(\'Mock Date to change when "now" is\', () => {\n  console.log(\'Normal:   \', new Date().getTime());\n\n  MockDate.set(new Date(1466424490000));\n\n  console.log(\'Mocked:   \', new Date().getTime());\n\n  MockDate.reset();\n\n  console.log(\'Restored: \', new Date().getTime());\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

并且测试结果是这样的:

\n\n
$ npm run test\n> jest\n\n PASS  src/test.ts\n  \xe2\x9c\x93 Mock Date to change when "now" is (8ms)\n\n  console.log src/test.ts:4\n    Normal:    1585505136315\n\n  console.log src/test.ts:8\n    Mocked:    1466424490000\n\n  console.log src/test.ts:12\n    Restored:  1585505136322\n\nTest Suites: 1 passed, 1 total\nTests:       1 passed, 1 total\nSnapshots:   0 total\nTime:        1.804s\n
Run Code Online (Sandbox Code Playgroud)\n\n

请参阅GitHub 上的参考项目

\n

  • 谢谢。我认为这个库之所以有效,是因为它是用 JS 编写的,而不是 TypeScript。我怀疑问题出在从 TS 到 JS 的翻译上。我正在寻找 TS 解决方案。 (2认同)

Rih*_*our 7

好吧,我试过这个解决方案,它奏效了..

class MockDate extends Date {
    constructor() {
        super("2020-05-14T11:01:58.135Z"); // add whatever date you'll expect to get
    }
}
Run Code Online (Sandbox Code Playgroud)

在之前的每个测试中,我补充说:

// @ts-ignore
global.Date = MockDate;
Run Code Online (Sandbox Code Playgroud)

这样,每当我调用一个包含 new Date() 的函数时,它都会返回我在上面 MockDate 类的构造函数中添加的日期!

  • 好主意!但是当调用“data.getFullYear()”时,我得到“这不是一个日期对象”。 (2认同)