Pregunta

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

dónde Dummy es una definición de clase vacía, y dummy es un Dummy. MockOf<T>() es una característica de administración simulada en una clase base, que básicamente asegura que cada vez que se llama a un tipo, devuelve la misma instancia simulada.

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

System.TypeLoadException:Escriba 'IObjectSet`1Proxy389e220f10aa4d9281d0b9e136edc1d4' del ensamblado 'DynamicProxyGenAssembly2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=a621a9e7e5c32e69' está intentando implementar una interfaz inaccesible.

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 ProxyGenerationOptions)
en Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(Escriba interfaceToProxy, Escriba[] advancedInterfacesToProxy, opciones de ProxyGenerationOptions, interceptores IInterceptor[])
en Moq.Mock1.<InitializeInstance>b__0()
at Moq.Mock
1.Inicializar instancia()
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 hizo referencia 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 compilación se realiza correctamente sin errores, advertencias o mensajes (excepto algunos relacionados con los contratos de código...)

¿Cómo puedo solucionar esto?

¿Fue útil?

Solución

¿Alguna de las interfaces o clases que está utilizando en sus pruebas es interna?¿Estás usando algo como [assembly: InternalsVisibleTo("YourTestAssembly")] para poder compilar las cosas?

Si es así, también necesitarás 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

Otros consejos

Descubrí que en mi caso había creado una instancia de clase ficticia para usar en mi prueba unitaria que resultó ser privada (ya que realmente no quería compartir el objeto de prueba afuera).

Mi código era el siguiente:

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

donde PrivateObject era una definición de clase privada dentro de mi TestClass.Por lo tanto, la solución en mi caso es garantizar que cualquiera de los tipos en su constructor Mock sea público.

public class PrivateObject () {}

(Obviamente tampoco llamaría a mi objeto público Objeto Privado...)

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

public IDoWork
{
    void DoWork();
}

Me tomó una eternidad darme cuenta de que el problema no estaba en esa interfaz, sino que la prueba unitaria 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, aunque IDoWork dice que es público, en realidad no lo es, ya que está incluido en una clase privada.

Espero que esto ayude a alguien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top