2012-12-24 37 views
5

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

चलो कहते हैं कि मैं निम्नलिखित हैं:

public interface IRepository 
{ 
    IQueryable<T> Query<T>(Expression<Func<T, bool>> expression); 
} 

public class Repository : IRepository 
{ 
    public IQueryable<T> Query<T>(Expression<Func<T, bool>> expression) 
    { 
     return _session.Query<T>(expression); 
    } 
} 

और मैं निम्नलिखित की तरह एक कल्पना लिखना चाहते हैं:

internal class when_executing_some_query : given_some_repository_context 
{ 
    Establish context =() => 
    { 
     IQueryable<SomeObject> objects = new List<SomeObject> 
     { 
      SomeObject1, 
      SomeObject2, 
      SomeObject3, 
     }.AsQueryable(); 

     _expectedList = new List<SomeObject> 
     { 
      SomeObject1, 
      SomeObject2, 
     }; 

     MockedRepository.Setup(x => x.Query<SomeObject>(Moq.It.IsAny<Expression<Func<SomeObject, bool>>>) 
      .Callback<Expression<Func<SomeObject, bool>>>(expression => _actualExpression = expression); 
    } 

    Because of =() => _actualList = objects.Select(_actualExpression).ToList(); 

    It should_execute_on_queryable_and_return_the_expected_items =() => //compare _expectedList with _actualList 
} 

हालांकि, मैं Moq.It.IsAny<Expression<Func<SomeObject, bool>>> पर त्रुटियों का निर्माण हो रही है कह

लिए अच्छी अतिभारित विधि मैच 'Project.Domain.IRepository.Query (System.Linq.Expressions.Expression>) है कुछ ऐसी अमान्य तर्क

और

तर्क 1: 'विधि समूह' से
को परिवर्तित नहीं कर सकते 'System.Linq.Expressions.Expression>' `

उत्तर

13

त्रुटियों को ठीक करने के लिए इस तरह आपको विधि को आमंत्रित करने की आवश्यकता है, इसे तर्क के रूप में पास न करें।

Moq.It.IsAny<Expression<Func<SomeObject, bool>>> 

लिए:

Moq.It.IsAny<Expression<Func<SomeObject, bool>>>() 

नोट कोष्ठकों बस अपने से कॉल बदल जाते हैं।

3

पर this answer आधार पर, यह है जैसे आप () बाद में की जरूरत है, उदाहरण के लिए लग रहा है It.IsAny<Expression<Func<SomeObject, bool>>>()

0

आपने ऊपर ठोस भंडार शामिल है, लेकिन इसकी यह कल्पना में इस्तेमाल कभी नहीं किया है, इसलिए मैं सिर्फ उदाहरण के लिए अपने पर भरोसा है। इसके अलावा, spec में एक मॉक रिपोजिटरी और एक सेटअप क्वेरी विधि है, लेकिन इसे कभी निष्पादित नहीं किया जाता है। इस spec को कंक्रीट चीज का परीक्षण करना चाहिए जो भंडार का उपयोग करता है। फिर आप क्वेरी विधि में पारित अभिव्यक्ति की तुलना कर सकते हैं।

भाव मुश्किल कर रहे हैं, लेकिन फिर भी mocks के साथ इतना अधिक। मुझे क्या Moq के सत्यापित करें का उपयोग करें और फिर Moq के Moq.It.Is <> का उपयोग आश्वस्त करने के लिए केवल गुजरता अगर एक्सप्रेशन से मेल खाता सत्यापित करें कि है। यहाँ एक उदाहरण है:

_repo.Verify(x=>x.Query(Moq.It.Is<Expression<Func<SomeObject, bool>>>(exp=>exp.Compile().Invoke(_exampleSomeObject))); 

असल में, यहाँ मैं Moq कह रहा हूँ कि केवल यह सत्यापित गुजरता है, तो वास्तविक अभिव्यक्ति _exampleSomeObject पर दिए गए काम करता है।

मैं अपने आईफोन पर टाइप कर रहा हूं, इसलिए अगर मैं तुरंत संकलित नहीं करता हूं तो मैं क्षमा चाहता हूं।

बस एक सुझाव: आपके कारण सेक्शन को कुछ क्रियाएं व्यक्त करनी चाहिए जो परिणाम का कारण बनती हैं। अभी, ऐसा लगता है कि बस की वजह से केवल पहले से ही परिणाम संसाधित हो रहा है।

0

आपके सेटअप में आप SomeObject पास कर रहे हैं।
आपके कॉलबैक में आप InstanceHealthReport के लिए पूछ रहे हैं।

भले ही InstanceHealthReport SomeObject का उप-वर्ग है, मुझे विश्वास है कि उन्हें सेटअप और कॉलबैक में मिलान करने की आवश्यकता है।

उम्मीद है कि मदद करता है।

कॉलिन

+0

उफ़, कि करने के लिए पोस्ट करने के लिए कोड "सामान्य बनाने" के प्रयास में सिर्फ एक टाइपो था, धन्यवाद उनका कहना है कि बाहर के लिए, मैं उसके अनुसार संपादित कर लिया है –