2011-09-14 15 views
10

के बाद मेरी सामान्य आधार भंडार इंटरफ़ेसMoq पैरामीटर TargetParameterCountException: पैरामीटर गिनती बेमेल अपवाद

public interface IRepository<T> 
{ 
    IQueryable<T> AllIncluding(params Expression<Func<T, 
           object>>[] includeProperties); 
} 

मेरी इकाई

public class Sdk 
{ 
    public Sdk() 
    { 
     this.Identifier = Guid.NewGuid().ToString(); 
    } 

    public virtual ICollection<Resource> AccessibleResources { get; set; } 

    public string Identifier { get; set; }  
} 

है और निम्न अब मैं कर रहा हूँ विशिष्ट रेपो

public interface ISdkRepository : IRepository<Sdk> 
{ 
} 

है moq

का उपयोग करके नियंत्रक का परीक्षण करने का प्रयास कर रहा है

के बाद कोड मैं निम्नलिखित परीक्षण

[Test] 
public void Can_Get_GetResources() 
{ 
    var cid = Guid.NewGuid().ToString(); 
    var mockRepo = new Moq.Mock<ISdkRepository>(); 
    var sdks = new HashSet<Sdk>() 
    { 
     new Sdk() 
     { 
      Identifier = cid, 
      AccessibleResources = new HashSet<Resource>() 
      { 
       new Resource() 
       { 
        Id = Guid.NewGuid(), 
        Description = "This is sdk" 
       } 
      } 
     } 
    }; 
    mockRepo.Setup(k => k. 
     AllIncluding(It.IsAny<Expression<Func<Sdk,object>>[]>())) 
         .Returns(sdks.AsQueryable); 
    var sdkCtrl = new SdksController(mockRepo.Object); 
    var returnedJson=sdkCtrl.GetResources(cid); 
    returnedJson.ToString(); 
} 

का उपयोग कर

public ActionResult GetResources(string clientId) { 
     var sdkObject = sdkRepository 
          .AllIncluding(k => k.AccessibleResources) 
          .SingleOrDefault(k => k.Identifier == clientId); 
     if (sdkObject == null) 
      throw new ApplicationException("Sdk Not Found"); 
     return Json(sdkObject.AccessibleResources.ToList()); 
    } 

परीक्षण करने के लिए कोशिश कर रहा हूँ है और यह फेंकने जाता है:

System.Reflection.TargetParameterCountException: पैरामीटर गिनती बेमेल

पता नहीं क्यों?

+0

में के रूप में Returns में अभिव्यक्ति में आर्ग की एक ही राशि के साथ कार्य करना कर सकते हैं आप स्टैक ट्रेस पेस्ट करते हैं? – Raghu

उत्तर

4

मुझे लगता है कि आपने यहां मोक के साथ कुछ सीमाएं डाली हैं। यह अभिव्यक्ति पैरामीटर को अच्छी तरह से संभाल नहीं करता है क्योंकि इसे अभिव्यक्तियों को मूल्यों के रूप में पारित किया जा सकता है। मोक के बारे में जानने का कोई तरीका नहीं है कि अभिव्यक्ति का कौन सा हिस्सा हल किया जाना है और हस्ताक्षर का हिस्सा क्या है।

इसके अलावा, मुझे याद नहीं है कि मोक xx []] को कितनी अच्छी तरह से संभालता है लेकिन यह संभव है कि आपके पास दो समस्याओं का संयोजन हो।

क्या आप ऐसी कक्षा बनाने में सक्षम हैं जो संपत्ति के रूप में अभिव्यक्तियों के सेट को उजागर करता है? यदि ऐसा है तो AllIncluding के हस्ताक्षर को बदलना संभव है और उस कक्षा के किसी भी उदाहरण पर मिलान करने के लिए Moq को बताएं।

अद्यतन

इस का जवाब देने के समय में एक सीमा थी, लेकिन अब संभव है। Oleksandr Lytvyn

+0

कृपया ओलेक्ज़ेंडर Lytvyn द्वारा जवाब में देखें। – Marcel

28

का उत्तर देखें हालांकि स्वीकार्य रूप से एक उत्तर दिया गया है, मेरा मानना ​​है कि आपके भंडार को सही तरीके से नकल करने का एक तरीका है।

mockRepo.Setup(k => k.AllIncluding(It.IsAny<Expression<Func<Sdk, object>>[]>())) 
        .Returns(sdks.AsQueryable); 

के बजाय का उपयोग

mockRepo.Setup(k => k.AllIncluding(It.IsAny<Expression<Func<Sdk, object>>[]>())) 
        .Returns((Expression<Func<Sdk, 
         object>>[] includeProperties) => sdks.AsQueryable()); 
+1

यह मेरा दिन बचाया) मुझे बिल्कुल वही समस्या थी, आपका प्रस्ताव काम करता है! –

+0

धन्यवाद! मुझे – trailmax

+0

बहुत पोकिंग बचाया! काम किया। क्या यह एक स्पष्टीकरण है कि यह कैसे काम करता है (यह वास्तव में क्या करता है)? – Marcel

7

एक अन्य समाधान इस समस्या को हल करने के लिए कृपया उपयोग करने के लिए है: .AsQueryable() बजाय .AsQueryable

0

अन्य लोगों के लिए इस समाधान का उत्तर देने के लिए Setup में Returns में अभिव्यक्ति में समान पैरामीटर जोड़ रहा था।

उदाहरण के लिए:

अलग तर्क के साथ काम नहीं कर

mock.Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<string>())) 
       .Returns((string s) => s.ToLower()); 

गिनती Setup

mock.Setup(x => x.DoSomething(It.IsAny<string>())) 
       .Returns((string s1, string s2) => s1.ToLower()); 
संबंधित मुद्दे