2010-02-11 13 views
30

नकल कर सकता हूं मैं एक संग्रह बना रहा हूं जो IQueryable का खुलासा करता है। मेरे यूनिट परीक्षण के लिए इसे मॉक करने का सबसे अच्छा तरीका क्या है?मैं कैसे IQueryable <T>

के बाद से मैं अपने नकली वस्तुओं के आराम के लिए RhinoMocks उपयोग कर रहा हूँ, मैं निम्नलिखित करने की कोशिश की:

IQueryable<MyObject> QueryObject = 
    MockRepository.GenerateStub<IQueryable<MyObject>>(); 

यह हालांकि तो मैं ऐसा करने की कोशिश की काम नहीं करता:

IQueryable<MyObject> QueryObject = 
    (new List<MyObject> { new MyObject() }).AsQueryable(); 

क्या ऐसा करने का कोई बेहतर तरीका है, या IQueryable में समर्थन के लिए कोई अन्य मॉकिंग फ्रेमवर्क बनाया गया है?

मेरे भंडार इंटरफ़ेस इस तरह दिखता है: यहाँ

public Post LoadPost(int year, int month, int day, string slug) 
{ 
    var query = from p in _blogRepository.Table 
       where 
        p.PartitionKey == Key.Partition(year, month, day) 
        && p.Slug == slug 
       select p; 

    var posts = _blogRepository.Query(query.Take(1)); 

    return posts.First(); 
} 

फिर परीक्षण मैं इसे अभी के रूप में है कि परीक्षण किया जाएगा LoadPost है:

public interface IRepository<T> where T : TableServiceEntity 
{ 
    IQueryable<T> Table { get; } 
    void Attach(T existingItem); 
    void Delete(T itemToDelete); 
    void Insert(T newItem); 
    T Load(string partitionKey, string rowKey); 
    IEnumerable<T> Load(string partitionKey); 
    IEnumerable<T> Query(IQueryable<T> query); 
    IEnumerable<T> Last(int count); 
    T Last(); 
    void Update(T item); 
} 

यहाँ विधि है कि मैं परीक्षण करना चाहते हैं ।

[Fact] 
public void LoadWillRetrieveByPartitionKeyAndRowKeyWhenUsingUriFormat() 
{ 
    Repository 
     .Stub(x => x.Query(Arg<IQueryable<Post>>.Is.Anything)) 
     .Return(new List<Post> {_post}); 

    var result = Service.LoadPost(
          _post.Year(), 
          _post.Month(), 
          _post.Day(), 
          _post.Slug); 

    Assert.NotNull(result); 
} 

कोड मेरे AzureBlog प्रोजेक्ट से लिया गया है।

+0

क्या आप अपना परीक्षण पेस्ट कर सकते हैं? – Grzenio

उत्तर

8

मैं आमतौर पर वास्तव में क्या आप अपने परीक्षण में कर समाप्त हो गया है। मेरे परीक्षण लिखते समय मुझे लगता है कि नेट लाइब्रेरी कक्षाएं सही तरीके से काम करती हैं और इसमें बग नहीं होती है, इसलिए मैं उन्हें परीक्षणों में उपयोग कर सकता हूं। जब मुझे एक परीक्षण सूची, संग्रह, क्वेरी करने योग्य, शब्दकोश, आदि की आवश्यकता होती है, तो मैं केवल वास्तविक चीज़ बनाता हूं और परीक्षण डेटा के साथ पॉप्युलेट करता हूं। यह परीक्षणों को और अधिक पठनीय और लिखने में तेज़ी से बनाता है, और ईमानदार होने के लिए जोखिम अस्तित्व में नहीं है।

3

यदि आप अपनी रिपॉजिटरी को मॉक करना चाहते हैं, तो आप IQueryable का मज़ाक उड़ाएंगे। इसके बजाए, निश्चित, ज्ञात मानों (जैसे आपका दूसरा उदाहरण) वापस करने के लिए अपने भंडार के तरीकों का नकल करें जिसका उपयोग आपके यूनिट परीक्षण चलाने के लिए किया जा सकता है।

+0

मैंने उस मार्ग को शुरू कर दिया था और फिर एक सामान्य भंडार पर एक विशिष्ट भंडार की एक अतिरिक्त परत बनाने के साथ समाप्त हो गया। इसके परिणामस्वरूप मेरी डोमेन सेवा -> डोमेन रिपोजिटरी -> जेनेरिक रिपोजिटरी। यदि मैं डोमेन सेवा -> जेनेरिक रिपोजिटरी से जाने में सक्षम हूं और अभी भी डोमेन सेवा में लीक करने के कार्यान्वयन विवरण के बिना टेस्टेबल हो सकता हूं तो मैं बहुत खुश हूं क्योंकि यह कम कोड है जिसे बनाए रखने और परीक्षण करने की आवश्यकता है। –

+0

मैं देख रहा हूं कि आप क्या कह रहे हैं। लेकिन यदि आपका प्रश्न आपके डोमेन सेवा के लिए यूनिट परीक्षण लिखने से उत्पन्न हुआ है, तो मुझे लगता है कि आपको डोमेन रिपोजिटरी का मज़ाक उड़ाया जाना चाहिए और जेनेरिक रिपोजिटरी (अभी के लिए) के बारे में चिंता न करें। यूनिट परीक्षण डोमेन सेवा को इसकी निर्भरताओं का मज़ाक उड़ाकर पूरा किया जाता है। जहां तक ​​डोमेन सेवा चलती है, उसे ध्यान नहीं देना चाहिए कि डोमेन रिपोजिटरी कैसे कार्यान्वित की जाती है (यानी बेस क्लास से विरासत में)। उम्मीद है की यह मदद करेगा! – PatrickSteele

0

मुझे यकीन नहीं है कि इससे आपकी मदद मिलेगी ... लेकिन मैंने कुछ ऐसा किया जो आप बात कर रहे हैं। मेरे परिदृश्य में, मेरे पास एक डेटा संदर्भ वर्ग था जो भंडार का उपयोग करता था।

मैंने एक इंटरफ़ेस (आईरिपोजिटरी) बनाकर शुरू किया जिसमें IQueryable विधि शामिल थी। फिर मैंने इस इंटरफेस को लागू करने वाले दो वर्ग बनाए। एक वर्ग डेटा मैनिपुलेशन (डीबीईएनटीटी रिपोजिटरी) के लिए ओआरएम का उपयोग करता है और दूसरी कक्षा क्लास प्रॉपर्टी (मेमोरी रिपोजिटरी) का उपयोग करती है। डेटा संदर्भ वर्ग में एक कन्स्ट्रक्टर था जिसके लिए आईआरपोजिटरी की आवश्यकता होती थी। ऐसा करने से मैं डेटा संदर्भ का परीक्षण करते समय मेमोरी रेपॉजिटरी का उपयोग कर सकता था और मैं एप्लिकेशन के लिए डीबीईन्टिटी रिपोजिटरी का उपयोग कर सकता था।

आप रुचि रखते हैं ... आप codeplex पर कोड पा सकते हैं: IQToolkitContrib

2

मुझे पता है कि यह एक पुराना सवाल है, लेकिन बस मेरे 2 सेंट जोड़ना चाहते हैं।

मुझे शार्पलाइट के साथ जेनरेट की गई रिपॉजिटरीज़ के साथ एक ही समस्या थी, जो समय-समय पर उपयोग करने वाला एएसपी .NET एमवीसी ढांचा है। कुछ समय बाद, मुझे एक समाधान मिला, एकमात्र मुद्दा यह है कि मोक का उपयोग कर रहा है, न कि राइनो मोक्स, लेकिन संभवतः आप इसे अनुकूलित करने का एक तरीका ढूंढ सकते हैं। मैंने इसे कैसे करें blog post here बनाया।

यह मूल रूप से एक सूची बना रहा है जो IQueryable लागू करता है और इसे नकली डेटा पृष्ठभूमि के रूप में उपयोग करता है। उम्मीद है कि मैं मदद कर सकता हूँ!

संबंधित मुद्दे