gpt4 book ai didi

node.js - 如何 "Fake"测试 Mongoose 模型的日期/时间

转载 作者:可可西里 更新时间:2023-11-01 09:13:57 27 4
gpt4 key购买 nike

在此之前,感谢您提供的任何帮助/建议!

我想要完成的事情

我正在尝试找到一种优雅的方法来在创建 Mongoose 模型实例时测试日期/时间。

我想确保存储的时间是正确的。

我的模型目前看起来像这样:

const messageSchema = mongoose.Schema({
user: { type: String, required: true },
message: { type: String, required: true },
created: { type: Date, default: Date.now },
});

const Message = mongoose.model('Message', messageSchema);

我将这个模型导入到 mocha 测试套件中,我正在尝试按照以下方式运行测试:

const now = {Date message was created}
it('check time matches time created', () => {
expect(message.created).to.equal(now);
});

到目前为止我尝试了什么

我尝试完成此操作的方法是使用 Sinon's Fake timers功能。

所以我的测试用例是这样的:

describe('creating new message', () => {
let clock;
let message;
let now;

before(() => {
clock = sinon.useFakeTimers();
clock.tick(100);
message = new Message({
user: 'Test User',
message: 'Test Message',
});
// Time the message was created
now = Date.now();
clock.tick(100);
});

it('check time matches time created', () => {
expect(message.created).to.equal(now);
});
});

为什么我认为这行不通

我认为这是行不通的,因为作为 Mongoose 模型默认传递的 Date.now 函数与 Sinon 假计时器隔离(假计时器在测试文件中,并且模型是从另一个文件导入的)。

再次感谢!

最佳答案

解决方案

只需包装 Date.now在匿名函数中,就像这样:

function() { return Date.now(); }

或者 ES6 版本

() => Date.now()

所以 Schema 会变成这样:

const messageSchema = mongoose.Schema({
user: { type: String, required: true },
message: { type: String, required: true },
created: { type: Date, default: () => Date.now() },
});

为什么有效?

因为当你做 sinon.useFakeTimers() , sinon 在后面做的是覆盖 global属性(property)Date .

并调用 Date与调用 global.Date 相同.

当你通过 Date.now对于 mongoose,您实际上是在传递 global.Date 引用的 Node 内部方法 , Mongoose 将调用此方法,而无需访问 global.Date 引用了。

但是,在我的解决方案中,我们传递了一个方法,当调用该方法时,它会访问 global.Date引用 | ,现在被 Sinon 打败了。

为了在实践中看到这种行为,您可以在 Javascript 中执行如下操作:

var nativeDate = Date; // accessing global.Date
Date = { now: () => 1 }; // overrides global.Date reference to a entirely new object
console.log(Date.now()); // now it outputs 1
console.log(nativeDate.now()); // outputs current date, stub doesn't work here, because it's calling the javascript native Date method, and not global.Date anymore

关于node.js - 如何 "Fake"测试 Mongoose 模型的日期/时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47915496/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com