So I tried to find this out on my own for the whole day. I've found some tips, but that's not enough.
I want make a query and manipulate with it's result. Problem is, the library I've used doesn't allow for that, as it returns a string, or object format. It doesn't simulate the result. Or at least I couldn't achieve it that way.
my code:
• controller:
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)
done()
})
.then(console.log)
.catch(console.log)
• model:
...
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
Libraries I used:
- mongoose
- mocha
- sinon
- sinon-mongoose
via Patryk Cieszkowski
No comments:
Post a Comment