如何unit testingmongoose模型?

所以我一整天都想自己找出来。 我发现了一些提示,但这还不够。

我想做一个查询和操作的结果。 问题是,我用过的库不允许,因为它返回一个string或对象格式。 它不模拟结果。 或者至less我不能这样做。

我的代码:

•控制器:

const UserMock = sinon.mock(User) const expectedResult = { "_id" : "58cc67ab9b11ec4cfd9ebb6e", "email" : "test@email.com", "password" : "$2a$10$3Oka.IuS/xoGJ4CgxWOPVerE.IVvKemsZchegvwsxopSwIJ08G1P." } UserMock .expects('findOne').withArgs({ email: 'test@email.com' }) .chain('exec') .resolves(expectedResult) User.findByEmail('test@email.com') .then((user) => user.comparePassword('password')) .then((user) => user.publishParse(user)) .then((user) => { UserMock.verify() UserMock.restore() assert.equal(user, {expectedResult.email, id: expectedResult._id}) done() }) .then(console.log) .catch(console.log) 

•型号:

 ... const userSchema = new Schema({ email: { type: String, required: true, unique: true, dropDups: true, minlength: [5], validate: { isAsync: true, validator: isEmail, message: 'Invalid email' } }, password: { type: String, required: true, minlength: [6, "Password must has at least 6 chars."] } }, { toJSON: { transform: function(doc, ret) { ret.id = ret._id delete ret._id delete ret.__v } } }) userSchema.methods.comparePassword = function(password) { return new Promise((resolve, reject) => { bcrypt.compare(password, this.password, (err, isMatch) => { if (err || !isMatch) { return reject(err) } resolve(this) }) }) } userSchema.methods.publishParse = function() { let _user = this.toJSON() delete _user.password return _user } userSchema.statics.findByEmail = function(email) { return this.findOne({ email }).exec() } const User = mongoose.model('User', userSchema) export default User 

我使用的图书馆:

  • mongoose
  • 摩卡
  • 兴农
  • 兴农,mongoose

Mockgoose运行MongoDB的内存副本并redirect您的Mongoose连接。

Mockgoose保存所有“为什么不是我的模拟像mongoose”时间,只有当你通过一个简单的例子进入多个查询或更复杂的操作时,只会变得更糟糕。

尽pipe在这个阶段testing并不是真正的unit testing,但是如果你可以在你的“单元”中增加mongoosemongodb以及mongodb-prebuilt话,那么这是我发现的用于mongoose数据库交互的最佳解决scheme。

monbodb-prebuilt是~200MB,所以可以影响开发依赖安装。