2013-05-24 5 views
6

मैं नेवला इस वस्तु में इस्तेमाल निर्भरता ठूंठ कोशिश कर रहा हूँ का उपयोग कर एक नेवला मॉडल छोटा करते:सिनोन

var Page = function(db) { 

    var mongoose = db || require('mongoose'); 

    if(!this instanceof Page) { 
     return new Page(db); 
    } 

    function save(params) { 
     var PageSchema = mongoose.model('Page'); 

     var pageModel = new PageSchema({ 
      ... 
     }); 

     pageModel.save(); 
    } 

    Page.prototype.save = save; 
} 

module.exports = Page; 

this question के लिए उत्तर का उपयोग करना, मैं यह कर की कोशिश की है:

mongoose = require 'mongoose' 
sinon.stub mongoose.Model, 'save' 

लेकिन मुझे त्रुटि मिली:

टाइपरर: फ़ंक्शन के रूप में अपरिभाषित संपत्ति को सहेजने का प्रयास

मैं भी इस की कोशिश की:

sinon.stub PageSchema.prototype, 'save' 

और फिर मैं त्रुटि मिली:

लेखन त्रुटि: ऑब्जेक्ट की संपत्ति

किसी को भी इस के साथ मदद कर सकते हैं लपेट कर देना चाहिए? मैं क्या गलत कर रहा हूं?

+0

मैं एक ही समस्या आ रही है –

उत्तर

7

मैंने मोंगोज स्रोत का विश्लेषण किया है और ऐसा नहीं लगता कि यह संभव है। सहेजें फ़ंक्शन मॉडल पर परिभाषित नहीं किया गया है, लेकिन hooks npm द्वारा गतिशील रूप से जेनरेट किया गया है जो pre/post middleware कार्यक्षमता को सक्षम बनाता है।

हालांकि, अगर आप इस तरह उदाहरण पर बचाने ठूंठ कर सकते हैं:

page = new Page(); 
sinon.stub(page, 'save', function(cb){ cb(null) }) 

अद्यतन: pageModel

प्रथम को छोटा करते हैं, तो आप Page की स्वयं की संपत्ति के रूप में यह निर्धारित करके pageModel सुलभ बनाने के लिए की जरूरत है (this.pageModel = xxx)। उसके बाद, आप यह कर सकते हैं ठूंठ bellow से पता चला की तरह:

mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/test'); 
mongoose.set('debug', true); 

schema = new mongoose.Schema({title: String}); 
mongoose.model('Page', schema); 


var Page = function(db) { 

    var mongoose = db || require('mongoose'); 

    if(!this instanceof Page) { 
    return new Page(db); 
    } 

    var PageSchema = mongoose.model('Page'); 
    this.pageModel = new PageSchema(); 

    function save(params, cb) { 
    console.log("page.save"); 
    this.pageModel.set(params); 
    this.pageModel.save(function (err, product) { 
     console.log("pageModel.save"); 
     cb(err, product); 
    }); 
    } 

    Page.prototype.save = save; 
}; 


page = new Page(); 

sinon = require('sinon'); 
sinon.stub(page.pageModel, 'save', function(cb){ 
    cb("fake error", null); 
}); 

page.save({ title: 'awesome' }, function (err, product) { 
    if(err) return console.log("ERROR:", err); 
    console.log("DONE"); 
}); 
+0

मैं यह कर की कोशिश की है, लेकिन मैं एक त्रुटि कह रही है कि प्राप्त कर रहा -

नीचे के रूप में अपने ठूंठ के लिए नकली समारोह को जोड़ने के लिए प्रयास करें विधि 'सहेजें'। मैंने mongoose.model ('पेज') कहा है, इसका बनाया और उसका उदाहरण और फिर मैंने इसे stubied। – vintem

+0

हम्म .. क्या आप 'PageModel.save' को बाहर निकालने की कोशिश कर रहे हैं? –

+0

मैं चाहता हूं कि डेटाबेस पर जाने से बचें। इससे कोई फर्क नहीं पड़ता कि कैसे। सबसे पहले मैंने डी mongoose.model stub करने की कोशिश की। अब मैं पेज मॉडेल.save – vintem

5

मैं सुझाव है कि आप stub के बजाय mock उपयोग करने के लिए, कि जाँच करेगा विधि वास्तव में मूल वस्तु पर मौजूद है।

var page = new Page(); 

// If you are using callbacks, use yields so your callback will be called 
sinon.mock(page) 
    .expects('save') 
    .yields(someError, someResult); 

// If you are using Promises, use 'resolves' (using sinon-as-promised npm) 
sinon.mock(page) 
    .expects('save') 
    .resolves(someResult); 

sinon-mongoose को एक नजर डालें। आप कुछ लाइनों के साथ जंजीर विधियों (दोनों मोंगोस मॉडल और दस्तावेज़ों) की अपेक्षा कर सकते हैं (रेपो पर काम करने वाले उदाहरण हैं)।

0
page = new Page(); 
sinon.stub(page, 'save', function(cb){ cb(null) }) 

उपरोक्त कोड को हटा दिया गया है। वस्तु को बचाने नहीं है: ..

sinon.stub(page, 'save').callsFake(function(cb){ 
     // do your Fake code 
     cb(null) 
}) 
संबंधित मुद्दे