2011-11-02 12 views
14

का उपयोग करके एक नकली में अभिव्यक्ति कैसे सेट करें I इस विषय के बारे में कई अन्य QA पढ़ चुके हैं और मुझे अभी भी मेरी समस्या का हल नहीं मिल रहा है, इसलिए मैं मेरे मामले का पर्दाफाश करने का फैसला किया है।Moq.Mock <अभिव्यक्ति <Func<T,bool> >>() - Moq

मैं इस इंटरफेस है

public interface IRepository<T> where T : class, IEntity 
{ 
    IQueryable<T> Find(Expression<Func<T, bool>> predicate); 
    T FindIncluding(int id, params Expression<Func<T, object>>[] includeProperties); 
} 

और यह

public PeopleController CreatePeopleController() 
{ 
    var mockUnitofWork = new Mock<IUnitOfWork>(); 
    var mockPeopleRepository = new Mock<IRepository<Person>>(); 

    mockPeopleRepository.Setup(r=>r.Find().Returns(new Person(){}); 
    mockUnitofWork.Setup(p => p.People).Returns(mockPeopleRepository.Object); 
    return new PeopleController(mockUnitofWork.Object); 
} 

मैं सेटअप नकली का उपयोग करने के प्रयास कर रहे हैं सेटअप करने के लिए विधि है कि नकली होता है कि मैं चाहूँगा की बुनियादी संरचना है इस तरह से:

public PeopleController CreatePeopleController() 
{ 
    var mockUnitofWork = new Mock<IUnitOfWork>(); 
    var mockPeopleRepository = new Mock<IRepository<Person>>(); 

    mockPeopleRepository.Setup(r=>r.Find(It.isAny<Expression<Func<Person,bool>>>()).Single()).Returns(new Person(){}); 
    mockUnitofWork.Setup(p => p.People).Returns(mockPeopleRepository.Object); 
    return new PeopleController(mockUnitofWork.Object); 
} 

लेकिन सिस्टम हमेशा एक ही अपवाद फेंकता "System.NotSup portedException: अभिव्यक्ति के लिए एक विधि है कि मज़ाक उड़ाया वस्तु से संबंधित नहीं है .... "

इसके अलावा, मैं जोड़ने के लिए है कि मैं MSTest और Moq

उपयोग कर रहा हूँ मुझे पता है कि सेटअप एक नकली अभिव्यक्ति का उपयोग नहीं है चाहते हैं को संदर्भित आसान और अनुशंसित नहीं है, लेकिन यह मेरे लिए बहुत महत्वपूर्ण है क्योंकि "ढूंढें" एक तरीका है जिसे मैं अपने ऐप

उत्तर

19

में बहुत कुछ उपयोग करता हूं समस्या यह है कि आप एकल() एक्सटेंशन विधि को सेट करने के लिए प्रयास कर रहे हैं आपका मजाक सेटअप कॉल को आपकी विधि का नतीजा होना चाहिए - इसके बाद आपके विधि का नतीजा कुछ विस्तार विधि के साथ इसके बाद लागू नहीं हुआ। यहाँ

[TestMethod] 
    public void MyTestMethod() 
    { 
     var myMock = new Mock<IRepository<Person>>(); 
     myMock.Setup(r => r.Find(It.IsAny<Expression<Func<Person, bool>>>())).Returns(new List<Person>() { new Person() }.AsQueryable()); 

     Assert.IsTrue(true); 
    } 

, तो आप सिर्फ सेटअप के साथ अपने ढूँढें() विधि छोटा करते रहे हैं, और (रिटर्न में अन्य सामान के सभी कर) खंड: मैं यह कोशिश होगी। मैं सामान्य रूप से दृष्टिकोण का सुझाव दूंगा। सेटअप को आपके मॉक किए गए आइटम को बिल्कुल दर्पण करना चाहिए, और आप रिटर्न्स() (या थ्रो() या जो भी हो) के लिए ब्लैक जादू का गुच्छा कर सकते हैं, जो आप चाहते हैं उसे करने के लिए कॉल करें।

(जब मैं वी.एस. में उस कोड भाग गया, इसे पारित, तो यह एक अपवाद फेंक नहीं था)

+0

एरिक बस .. अपने समाधान और उसके काम को लागू करने के लिए धन्यवाद अपने मदद!!! :) – gustavotroconis

+0

खुशी है कि यह मदद की। :) –

+0

@ गुस्तावोट्रोक्रोनिस अगर इस उत्तर ने आपकी समस्या हल की है, तो आप इसे इसके आगे के चेकमार्क पर क्लिक करके स्वीकार कर सकते हैं। जैसे ही आप अधिक प्रश्न पूछते हैं, आपके अवतार के नीचे "स्वीकृति%" दिखाई देगा, और उच्च% दूसरों को आपके प्रश्नों के उत्तर देने के लिए प्रोत्साहित करता है। –

4

आप कोड है कि अपने परीक्षण के द्वारा कवर नहीं है लिखने के लिए Moq के It.IsAny<> एक .CallBack बिना बलों का उपयोग करना। इसके बजाए, यह किसी भी क्वेरी/अभिव्यक्ति को पारित करने की इजाजत देता है, जो आपके मॉक को यूनिट परीक्षण परिप्रेक्ष्य से मूल रूप से बेकार प्रदान करता है।

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

mockPeopleRepository 
    .Setup(x => x.Find(ThatHas.AnExpressionFor<Person>() 
    .ThatMatches(correctPerson) 
    .And().ThatDoesNotMatch(deletedPerson) 
    .Build())) 
    .Returns(_expectedListOfPeople); 

यहाँ:: यहाँ अंत परिणाम (अपने उदाहरण के लिए अनुकूलित) है http://awkwardcoder.com/2013/04/24/constraining-mocks-with-expression-arguments/