2009-02-12 10 views
21

मैं अपनी परियोजना में एक कमांड लाइन इंटरफ़ेस लिख रहा हूं। उपयोगकर्ता "प्रोजेक्ट फू बनाएं" में प्रवेश करता है, और यह "प्रोजेक्ट" के लिए जिम्मेदार नियंत्रक पाता है और फिर Create विधि को पहले तर्क के रूप में "foo" पास करने के लिए आमंत्रित करता है।क्या मैं नकली कक्षा में विशेषताओं को जोड़ने के लिए Moq प्राप्त कर सकता हूं?

यह गुण और प्रतिबिंब पर काफी निर्भर करता: नियंत्रक इस तरह दिखता है:

[ControllerFor("project")] 
class ProjectController 
{ 
    [ControllerAction("create")] 
    public object Create(string projectName) { /* ... */ } 
} 

मैं पार्सर के लिए इकाई परीक्षण में Moq उपयोग करना चाहते हैं, कुछ इस तरह:

Mock<IProjectsController> controller = new Mock<IProjectsController>(); 
controller.Expect(f => f.Create("foo")); 

parser.Register(controller.Object); 
parser.Execute("create project foo"); 

controller.VerifyAll(); 

इंटरफ़ेस में विशेषताओं को जोड़ना काम नहीं करता है - वे व्युत्पन्न कक्षाओं द्वारा विरासत में नहीं हैं।

क्या मैं कक्षा में गुणों को जोड़ने के लिए एमओक प्राप्त कर सकता हूं?

उत्तर

31

अद्यतन: मैं सिर्फ इतना है कि आप वास्तव में TypeDescriptor.AddAttributes का उपयोग करके एक मौजूदा प्रकार के गुण जोड़ सकते हैं महसूस किया गया है, जो एक उदाहरण या आ प्रकार के खिलाफ क्रियान्वित किया जा सकता:

Mock<IRepository> repositoryMock = new Mock<IRepository>(); 

CustomAttribute attribute = new CustomAttribute(); 

// option #1: to the instance 
TypeDescriptor.AddAttributes(repositoryMock.Object, attribute); 

// option #2: to the generated type 
TypeDescriptor.AddAttributes(repositoryMock.Object.GetType(), attributes); 

आप इसे की जरूरत है, AddAttribute एक टाइपडिस्क्रिप्टरप्रोवाइडर देता है जिसे बाद में गुणों को हटाने के लिए TypeDescriptor.RemoveProvider पर भेजा जा सकता है।

ध्यान रखें कि Attribute.GetCustomAttributes इस तरह से रनटाइम पर जोड़े गए गुण नहीं पाएंगे। इसके बजाय, TypeDescriptor.GetAttributes का उपयोग करें।

मूल उत्तर

मैं Moq (या उस बात के लिए किसी अन्य मजाक ढांचा) belive नहीं है कस्टम विशेषताओं का समर्थन करता है। मुझे पता है कि कैसल प्रॉक्सी (आमतौर पर कक्षा बनाने के लिए इस्तेमाल किया जाने वाला ढांचा) इसका समर्थन करता है, लेकिन मोक के माध्यम से इसका उपयोग करने का कोई तरीका नहीं होगा।

आपकी सबसे अच्छी शर्त इंटरफ़ेस में विशेषताएँ लोड करने की आपकी पद्धति को सारणीबद्ध करना है (जो प्रकार और विशेषता प्रकार स्वीकार करता है) और फिर उस पर नकल करें।

संपादित करें: उदाहरण के लिए:

public interface IAttributeStrategy 
{ 
    Attribute[] GetAttributes(Type owner, Type attributeType, bool inherit); 
    Attribute[] GetAttributes(Type owner, bool inherit); 
} 

public class DefaultAttributeStrategy : IAttributeStrategy 
{ 
    public Attribute[] GetAttributes(Type owner, Type attributeType, bool inherit) 
    { 
     return owner.GetCustomAttributes(attributeType, inherit); 
    } 

    public Attribute[] GetAttributes(Type owner, bool inherit) 
    { 
     return owner.GetCustomAttributes(inherit); 
    } 
} 

वर्ग कि जरूरत गुण IAttributeStrategy का एक उदाहरण का उपयोग करता है (या तो एक आईओसी कंटेनर, या होने के माध्यम से वैकल्पिक रूप से निर्माता में पारित कर दिया)। आमतौर पर यह एक डिफ़ॉल्टAttributeStrategy होगा, लेकिन अब आप आउटपुट को ओवरराइड करने के लिए IAttributeStrategy का नकल कर सकते हैं।

यह दृढ़ हो सकता है, लेकिन अमूर्तता की एक परत जोड़ना वास्तव में गुणों का नकल करने की कोशिश करने से अधिक आसान है।

+0

क्या आप इंटरफ़ेस दृष्टिकोण पर विस्तार कर सकते हैं? मुझे नहीं लगता कि यह मेरे द्वारा किए जा रहे कार्यों के अनुरूप होगा, लेकिन मैं इसे सुनिश्चित करने के लिए देखना चाहता हूं। –

+0

TypeDescriptor.AddAttributes –

+0

पर मेरी अद्यतन प्रतिक्रिया देखें (मुझे बताएं कि क्या मेरा अपडेट किया गया उत्तर आपकी समस्या हल करता है और मैं उत्तर के पुराने हिस्सों को हटा दूंगा) –

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

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