我有一个方法依赖于 new Date
创建一个日期对象然后对其进行操作。我正在测试操作是否按预期工作,因此我需要将返回日期与预期日期进行比较。为此,我需要确保 new Date
在测试和被测试的方法中返回相同的值。我怎样才能做到这一点?
有没有办法实际模拟构造函数的返回值?
我可以创建一个模块,该模块需要一个提供日期对象并可以被模拟的函数。但这在我的代码中似乎是一个不必要的抽象。
要测试的示例函数…
module.exports = {
sameTimeTomorrow: function(){
var dt = new Date();
dt.setDate(dt + 1);
return dt;
}
};
我如何模拟 new Date()
的返回值?
原文由 Seth Feldkamp 发布,翻译遵循 CC BY-SA 4.0 许可协议
更新:这个答案是
jest < version 26
最近的笑话版本见这个答案。您可以使用
jest.spyOn
模拟像 new Date() 这样的构造函数,如下所示:输出看起来像:
请参阅 GitHub 上的参考项目。
注意:如果您使用的是 TypeScript 并且会遇到编译错误,
Argument of type '() => Date' is not assignable to parameter of type '() => string'. Type 'Date' is not assignable to type 'string'
。在这种情况下,一种解决方法是使用 mockdate 库,它可用于更改“现在”的时间。有关详细信息,请参阅 此问题。