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)
解决方法是使用模拟日期库,它可用于更改“现在”的时间。
\n\nconst 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好吧,我试过这个解决方案,它奏效了..
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 类的构造函数中添加的日期!
归档时间: |
|
查看次数: |
7968 次 |
最近记录: |