2010-04-23 16 views
5

मैं मोक के लिए पूरी तरह से नया हूं और अब System.Reflection.Assembly कक्षा के लिए एक नकली बनाने की कोशिश कर रहा हूं। मैं इस कोड का उपयोग कर रहा:Moq के साथ ISerializable कक्षाओं का नकल कैसे करें?

var mockAssembly = new Mock<Assembly>(); 
mockAssembly.Setup(x => x.GetTypes()).Returns(new Type[] { 
    typeof(Type1), 
    typeof(Type2) 
}); 

लेकिन जब मैं परीक्षण चलाने मैं अगले अपवाद:

System.ArgumentException : The type System.Reflection.Assembly 
implements ISerializable, but failed to provide a deserialization 
constructor 
Stack Trace: 
    at 
Castle.DynamicProxy.Generators.BaseProxyGenerator.VerifyIfBaseImplementsGet­ObjectData(Type 
baseType) 
    at 
Castle.DynamicProxy.Generators.ClassProxyGenerator.GenerateCode(Type[] 
interfaces, ProxyGenerationOptions options) 
    at Castle.DynamicProxy.DefaultProxyBuilder.CreateClassProxy(Type 
classToProxy, Type[] additionalInterfacesToProxy, 
ProxyGenerationOptions options) 
    at Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Type 
classToProxy, Type[] additionalInterfacesToProxy, 
ProxyGenerationOptions options, Object[] constructorArguments, 
IInterceptor[] interceptors) 
    at Moq.Proxy.CastleProxyFactory.CreateProxy[T](ICallInterceptor 
interceptor, Type[] interfaces, Object[] arguments) 
    at Moq.Mock`1.<InitializeInstance>b__0() 
    at Moq.PexProtector.Invoke(Action action) 
    at Moq.Mock`1.InitializeInstance() 
    at Moq.Mock`1.OnGetObject() 
    at Moq.Mock`1.get_Object() 

तुम मुझे Moq साथ ISerializable कक्षाएं (जैसे System.Reflection.Assembly) उपहास करने के लिए सही तरीके से सिफारिश की जा सकी।

अग्रिम धन्यवाद!

उत्तर

2

समस्या ISerializable इंटरफ़ेस के साथ नहीं है। आप नकली ISerializable कक्षाएं कर सकते हैं।

सूचना अपवाद संदेश:

प्रकार System.Reflection.Assembly लागू करता ISerializable, लेकिन एक अक्रमांकन निर्माता

समस्या है प्रदान करने के लिए विफल रहा है, कि विधानसभा अक्रमांकन प्रदान नहीं करता है निर्माता।

+0

ठीक है, धन्यवाद। लेकिन क्या आप सुझाव दे सकते हैं कि उस मामले में मोक का उपयोग करके deserialization कन्स्ट्रक्टर कैसे प्रदान करें। – sam

+0

आप नहीं कर सकते - असेंबली में कोई सुलभ कन्स्ट्रक्टर नहीं है, और जैसा कि Moq का उपयोग करते समय यह अनजान है: | –

+0

आपको मॉक असेंबली के लिए एक deserialization कन्स्ट्रक्टर प्रदान करने की आवश्यकता नहीं है। आप interop _Assembly कक्षा का मज़ाक उड़ा सकते हैं और जरूरत पड़ने पर असेंबली में जा सकते हैं। – nathanchere

1

एक नकली के बजाय आप एक गतिशील असेंबली बनाने और उस से निर्माण करने का प्रयास कर सकते हैं।

var appDomain = AppDomain.CurrentDomain; 
var assembly = appDomain.DefineDynamicAssembly(new AssemblyName("Test"), AssemblyBuilderAccess.ReflectionOnly); 
0

जैसा कि पहले से समझाया गया है, समस्या यह है कि असेंबली एक deserialization कन्स्ट्रक्टर का खुलासा नहीं कर रहा है। इसका मतलब यह नहीं है कि यह नहीं किया जा सकता है।

Moq का उपयोग कर एक समाधान अपने उदाहरण के अनुसार होगा:

var mock = new Mock<_Assembly>(); 
    result.Setup(/* do whatever here as usual*/); 

ध्यान दें कि _Assembly उपयोग करने के लिए आप संदर्भ के लिए System.Runtime.InteropServices

4

System.Reflection.Assembly सार है की आवश्यकता होगी, तो आप नहीं कर सकते इसका एक नया उदाहरण बनाएं। हालांकि, आप एक टेस्ट क्लास बना सकते हैं जो करता है और उसे मॉक करता है।

उदाहरण:

 
[TestMethod] 
public void TestSomethingThatNeedsAMockAssembly() 
{ 
    string title = "title";
var mockAssembly = new Mock();
mockAssembly.Setup(a => a.GetCustomAttributes(It.Is(s => s == Type.GetType("System.Reflection.AssemblyTitleAttribute")), It.IsAny())).Returns(new System.Attribute[] { new AssemblyTitleAttribute(title) });

var c = new ClassThatTakesAssemblyAndParsesIt(mockAssembly.Object); Assert.IsTrue(c.AssemblyTitle == title); //etc } public class TestAssembly : Assembly { public TestAssembly() { //could probably do something interesting here } }

+1

+1 राइनोमोक्स का उपयोग करके, '_Assembly' चाल मेरे लिए काम नहीं करती है, और मैं इसका उपयोग कर समाप्त हुआ। इस ज्ञान को साझा करने के लिए सिर्फ एक प्रश्न की तलाश थी। – mao47

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