Moq

2010-06-18 5 views
36

के साथ मूल विधि को कॉल करना मेरे पास 2 विधियों, GetAllProducts और GetProductByType के साथ एक उत्पाद रिपोर्ट है, और मैं GetProductByType पर तर्क का परीक्षण करना चाहता हूं। आंतरिक रूप से, GetProductByType GetAllProducts पर कॉल करता है और फिर सही वाले फ़िल्टर करता है।Moq

public virtual IEnumerable<Product> GetAllProducts() 
{ 
    //returns all products in memory, db etc 
} 

public virtual IEnumerable<Product> GetProductsByType(string type) 
{ 
    return (from p in GetAllProducts() where p.Type == type select p).ToList(); 
} 

तो अपने परीक्षण में मैं, GetAllProducts करने के लिए कॉल उपहास करने के लिए तो यह अपने परीक्षण में परिभाषित उत्पादों की एक सूची देता है, और उसके बाद फोन मूल GetProductsByType, मज़ाक उड़ाया GetAllProducts की खपत होगी जो चाहते हैं।

मैं नीचे दिए गए कोड की तरह कुछ कोशिश कर रहा हूं लेकिन मूल GetProductByType निष्पादित नहीं किया गया है, यह भी मॉक-आउट है। टाइपमैक में मेरे पास एक कॉलऑरिगिनल विधि है जो इसे ठीक करती है, लेकिन मैं इसे मोक के साथ नहीं समझ सकता। कोई विचार?

var mock = new Mock<ProductRepository>(); 
mock.Setup(r => r.GetAllProducts()).Returns(new List<Product>() {p1, p2, p3}); 
var result = mock.Object.GetProductsByType("Type1"); 
Assert.AreEqual(2, result.Count()); 
+2

मैं सिर्फ आपके उत्पाद रिपोजिटरी को उप-वर्गीकृत कर दूंगा और इसे बिल्कुल मॉक नहीं करूँगा। आपका "FakeProductRepository" उत्पादों की हार्ड कोडित सूची लौटाएगा और आप उस सूची के विरुद्ध GetProductsByType का परीक्षण कर सकते हैं। –

+0

महान सुझाव, उस बारे में सोचा नहीं है ... शुक्रवार! – rodbv

उत्तर

56

सेट अपने नकली पर सत्य पर CallBase। यह मूल वर्चुअल विधियों या गुणों को कॉल करेगा यदि वे मौजूद हैं, और डिब्बाबंद मान वापस करने के लिए सेट अप नहीं किए गए हैं।

var mock = new Mock<ProductRepository>() { CallBase = true }; 
+0

मीठा, आज ऐसा करने की कोशिश कर पागल हो रहा था। धन्यवाद। – PmanAce