Mongoose の virtual attributes を sinon で stub 化する方法をご紹介します。
まず、下記のような Product model が定義されているとします。
# define Mongoose Product model
mongoose = require 'mongoose'
productSchema = new mongoose.Schema({
# something
})
productSchema.virtual('discountPercentage').get ()->
# calculate discountPercentage
return discountPercentage
Product = mongoose.model 'Product', productSchema
そして、テストコードで discountPercentage virtual をスタブ化するコードは下記のような感じです。
# in test code
sinon = require 'sinon'
product = new Product()
console.log product.discountPercentage
# discountPercentage virtual の計算結果を返す
stub = sinon.stub product, 'get'
stub.withArgs('discountPercentage').returns 50
console.log product.discountPercentage
# 必ず 50 を返す
# 使い終わったら、忘れずに restore しましょう
stub.restore()
ポイントは sinon.stub mongooseInstance, ‘get’ と stub.withArgs(‘virtualName’).returns の部分で virtualName の返り値をスタブ化しているという点だけです。