moq typeloadexception

TypeLoadException al intentar simular IObjectSet con Moq



(3)

Tengo el siguiente código de configuración:

MockOf<IObjectSet<Dummy>>().Setup(c => c.AddObject(dummy)).Verifiable(); MockOf<IObjectContextWrapper>().Setup(c => c.GetObjectSet<Dummy>()).Returns(MockOf<IObjectSet<Dummy>>().Object);

donde Dummy es una definición de clase vacía, y dummy es un Dummy . MockOf<T>() es una función de gestión simulada en una clase base, que básicamente se asegura de que cada vez que se llame a un tipo, devuelva la misma instancia simulada.

La prueba que contiene este código de configuración falla con una TypeLoadException y el siguiente mensaje:

System.TypeLoadException: escriba ''IObjectSet`1Proxy389e220f10aa4d9281d0b9e136edc1d4'' del ensamblado ''DynamicProxyGenAssembly2, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = a621a9e7e5c32e69ve) en este caso.

en System.Reflection.Emit.TypeBuilder.TermCreateClass (módulo RuntimeModule, Int32 tk, tipo ObjectHandleOnStack)
en System.Reflection.Emit.TypeBuilder.CreateTypeNoLock ()
en System.Reflection.Emit.TypeBuilder.CreateType ()
en Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.BuildType ()
en Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator.GenerateCode (Tipo proxyTargetType, Tipo [] interfaces, opciones de ProxyGenerationOptions)
en Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget (Tipo interfaceToProxy, Tipo [] adicionalInterfacesToProxy, ProxyGenerationOptions opciones, IInterceptor [] interceptores)
en Moq.Mock 1.<InitializeInstance>b__0()
at Moq.Mock
1.<InitializeInstance>b__0()
at Moq.Mock
1.<InitializeInstance>b__0()
at Moq.Mock
1.InitializeInstance ()
en Moq.Mock`1.get_Object ()
en OddEnds.Tests.Data.EntityFramework.RepositoryTest.Delete_DeletesObjectFromObjectSet () en RepositoryTest.cs: línea 43

He importado System.Data.Objects y he referenciado tanto a System.Data.Entity.dll como a Microsoft.Data.Entity.CTP.dll tanto en el proyecto de prueba como en el proyecto donde reside la clase que se está probando. La creación se realiza correctamente sin errores, advertencias o mensajes (excepto algunos relacionados con los Contratos de Código ...)

¿Cómo puedo solucionar esto?


¿Alguna de las interfaces o clase que está utilizando en sus pruebas es interna? ¿Está utilizando algo como [assembly: InternalsVisibleTo("YourTestAssembly")] para que las cosas se compilen?

Si es así, también deberá agregar uno para DynamicProxyGenAssembly2 para que Moq genere dinámicamente el proxy para las clases.

//goes in the AssemblyInfo.cs where the internal interfaces / classes are defined [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]

Aquí hay una publicación relevante sobre el tema.

http://sonofpirate.blogspot.com/2009/09/my-first-foray-into-unit-testing-with.html

espero que esto ayude


Descubrí que, en mi caso, había creado una instancia de clase ficticia para usarla en mi prueba de unidad que resultó ser privada (ya que no quería compartir el objeto de prueba fuera).

Mi código fue en este sentido:

var mockMonitor = new Mock<ICacheMonitor<int, PrivateObject>>();

donde PrivateObject era una definición de clase privada dentro de mi TestClass. La solución en mi caso es, por lo tanto, asegurar que cualquiera de los tipos en su constructor de simulacros sea público.

public class PrivateObject () {}

(Obviamente, tampoco llamaría PrivateObject a mi objeto público ...)


Me tropecé con otro caso que no pude resolver al principio. Estaba trabajando en un proxy para una interfaz creada dentro de mi prueba de unidad ...

public IDoWork { void DoWork(); }

Me tomó una eternidad descubrir que el problema no estaba en esa interfaz, sino que la prueba de la unidad en sí no era pública:

class TestSomething // missing public keyword { // .. some test which tries to create a mock of the interface public IDoWork { void DoWork(); } }

Entonces, mientras IDoWork dice que es público, realmente no lo es, ya que está encerrado en una clase privada.

Espero que esto ayude a alguien.