Mongoose 在测试中没有抛出 E11000 重复键错误

时间:2021-05-21 16:25:33

标签: node.js mongodb mongoose jestjs

我有一个相当简单的 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
}

2 个答案:

答案 0 :(得分:0)

遇到了类似的问题。 通过关闭 MongoDB 服务器并重新启动它来解决它。

答案 1 :(得分:0)

由于删除了 DB afterEach 测试,我也删除了 unique 索引。这导致了 user.save() / user2.save() 和生成的索引之间的竞争条件 - user2.save() 更快,因此它被保存,因为 unique 约束尚不存在。

通过删除所有用户而不是删除数据库,索引保持完整并且没有发生竞争条件