我有一个相当简单的 UserSchema
。我简化了它以提高可读性
const UserSchema = new mongoose.Schema({
name: {
type: String,
required: true,
unique: true,
},
email: {
type: String,
required: true,
unique: true,
}
},
}, {
timestamps: true,
});
我现在想测试是否使用 jest
正确抛出了重复错误:
it("throws MongoDB duplicate error with code 11000", async () => {
const user = new User(testUsers.valid);
const user2 = new User(testUsers.valid); //clone user
await user.save();
try {
await user2.save();
fail("Should throw error");
} catch (err) {
const {name, code} = err;
validators.validateMongoDuplicationError(name, code);
}
});
我们希望 await user2.save()
抛出一个我们捕获的错误 - 但不幸的是,没有抛出任何错误,并且 jest 在 fail()
处自动失败。
尽管将姓名和电子邮件设置为 unique
Mongo 不会引发重复错误。为什么?
附加信息:
在保存第二个用户后调用 console.log
会为我们提供以下对象:
//console.log(user)
{
role: 'user',
favouriteColor: 'green',
_id: 60a7da5e7820e323e4bf9a31,
name: 'Name',
email: 'name@email.com',
password: '$2b$10$7ceCGzc8Zo03RK0xAFG50.QSBAAYejXmw6VNmdXhI1fhZNa2fFzn.',
createdAt: 2021-05-21T16:05:50.051Z,
updatedAt: 2021-05-21T16:05:50.051Z,
__v: 0
}
//console.log(user2)
{
role: 'user',
favouriteColor: 'green',
_id: 60a7da5e7820e323e4bf9a32,
name: 'Name',
email: 'name@email.com',
password: '$2b$10$qkB8OL6Rs00XfULT8haBfOKPy.h4hN3s3ZsQwtCeP/OEMYBMNArfa',
createdAt: 2021-05-21T16:05:50.124Z,
updatedAt: 2021-05-21T16:05:50.124Z,
__v: 0
}
答案 0 :(得分:0)
遇到了类似的问题。 通过关闭 MongoDB 服务器并重新启动它来解决它。
答案 1 :(得分:0)
由于删除了 DB afterEach
测试,我也删除了 unique
索引。这导致了 user.save() / user2.save()
和生成的索引之间的竞争条件 - user2.save()
更快,因此它被保存,因为 unique
约束尚不存在。
通过删除所有用户而不是删除数据库,索引保持完整并且没有发生竞争条件