2010-04-23 17 views
5

Soy completamente nuevo en Moq y ahora intento crear una simulación para System.Reflection.Assembly clase. Estoy usando este código:¿Cómo burlarse de clases ISerializable con Moq?

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

Pero cuando corro pruebas que conseguir al lado excepción:

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

¿Me podría recomiendo el camino correcto para burlarse ISerializable clases (como System.Reflection.Assembly) con Moq.

¡Gracias de antemano!

Respuesta

2

El problema no es con la interfaz ISerializable. Usted puede simulacros Clases ISerializables.

Aviso el mensaje de excepción:

El tipo System.Reflection.Assembly implementa ISerializable, pero no para proporcionar una deserialización constructor

El problema es que la Asamblea no proporciona deserialización constructor.

+0

Ok, gracias. Pero podría sugerir cómo proporcionar el constructor de deserialización usando Moq en ese caso. – sam

+0

no se puede - Assembly no tiene ningún constructor accesible, y como tal no se puede mover al usar Moq: | –

+0

No es necesario que proporcione un constructor de deserialización para simular Assembly. Puede simular la interoperabilidad _ Clase de ensamblaje y enviarla al ensamblado cuando sea necesario. – nathanchere

1

En lugar de un simulacro, podría intentar crear un ensamblaje dinámico y construir a partir de eso.

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

Como ya se explicó, el problema es que Assembly no expone un constructor de deserialización. Esto no significa que no se pueda hacer bien.

Una solución usando Moq como por su ejemplo podría ser:

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

Note que para usar _Assembly tendrá que hacer referencia a System.Runtime.InteropServices

4

System.Reflection.Assembly es abstracto, por lo que no puede crea una nueva instancia de él. Sin embargo, puede crear una clase de prueba que lo haga y simular eso.

Ejemplo:

 
[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 Usando RhinoMocks, el truco '_Assembly' no funcionó para mí, y terminé usando esto. Solo estaba buscando una pregunta para compartir este conocimiento. – mao47

Cuestiones relacionadas