views:

142

answers:

2

Hi there,

I'm completly new to Moq and now trying to create a mock for System.Reflection.Assembly class. I'm using this code:

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

But when I run tests I get next exception:

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() 

Could you reccomend me the right way to mock ISerializable classes (like System.Reflection.Assembly) with Moq.

Thanks in advance!

+1  A: 

The issue is not with ISerializable interface. You can mock ISerializable classes.

Notice the exception message:

The type System.Reflection.Assembly implements ISerializable, but failed to provide a deserialization constructor

Problem is, that Assembly does not provide deserialization constructor.

Krzysztof Koźmic
Ok, thanks. But could you suggest how to provide deserialization constructor using Moq in that case.
asmois
you can't - Assembly does not have any accessible constructor, and as such it's unmockable when using Moq :|
Krzysztof Koźmic
A: 

Instead of a mock you could try creating a dynamic assembly and build from that.

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