2010-08-12 16 views
14

Golpeando mi cabeza contra la pared tratando de hacer funcionar un escenario de prueba realmente simple. ¡Estoy seguro de que me estoy perdiendo algo realmente simple!Tiene problemas para comenzar con Moq y Nunit

lo que haga, me parece que el siguiente error de la interfaz gráfica de usuario NUnit cuando se ejecuta una prueba en contra de mi DLL: System.TypeLoadException: Tipo 'Castle.Proxies.ITestProxy' del ensamblado 'DynamicProxyGenAssembly2, versión = 0,0. 0.0, Culture = neutral, PublicKeyToken = null 'está intentando implementar una interfaz inaccesible.

Ahora he visto referencias a este error en un montón de lugares cuando busco en Stack Overflow y en otros lugares, pero la solución que sigo encontrando no parece ayudar. ¡Y ni siquiera estoy usando una interfaz interna en esta etapa! La solución que veo todo el lugar es demasiado poner la siguiente línea en AssemblyInfo.cs

[assembly: InternalsVisibleTo ("DynamicProxyGenAssembly2")]

que estoy usando:

  • Visual Studio 2010 Professional
  • C# 4.0
  • Moq 4.10810.8 Beta (bin desplegado)
  • NUnit 2.5.5 (instalado en el GAC)

para recrear este error, todo lo que tiene que hacer es:

  1. Crear un nuevo proyecto de biblioteca de clases
  2. Referencia Moq y Unidad (como el anterior)
  3. Crear una interfaz. He llamado a mi interfaz ITest, la hice pública, y tiene un método que es 'string TestMethod();'. Estoy haciendo esto en el proyecto local por simplicidad.
  4. Crear una clase llamada 'Prueba', decorado con [TextFixture] y un método de prueba que se llama 'TestMethod' decorado con [Test]
  5. construir el proyecto, a continuación, ejecutar NUnit contra la DLL que resulta en la carpeta de depuración.

Aquí es el contenido de mi clase de prueba

namespace MoqTest { 
[TestFixture] 
public class Testing { 
    [Test] 
    public void TestMethod() { 

     var testMock = new Mock<ITest>(); 
     testMock.Setup(x => x.TestMethod()).Returns("String val"); 
     var xyz = testMock.Object; 

     Assert.AreEqual(1, 1); 

    } 
} 

}

---- ACTUALIZACIÓN --- Después de cambiar la versión de Moq 4.10810.8 a 4.0.10501.6 todo funciona ¡multa!

Respuesta

6

La siguiente prueba pasa por mí:

public interface ITest { string TestMethod(); } 

public class Testing 
{ 
    [Test] 
    public void TestMethod() 
    { 
     var testMock = new Mock<ITest>(); 
     testMock.Setup(x => x.TestMethod()).Returns("String val"); 
     var xyz = testMock.Object; 

     Assert.AreEqual(1, 1); 
    } 
} 

Si su interfaz es pública y en el mismo conjunto, realmente debería haber ningún problema. Sospecho que acabas de perder una palabra clave de accesibilidad en alguna parte, ya que una interfaz no pública provoca un error de tiempo de ejecución porque el ensamblaje proxy no podrá instanciar un tipo basado en él.

Probablemente lo mejor que se puede hacer es comenzar con el código que he proporcionado y cambiar una cosa a la vez hasta que coincida con el código que falla. Si ejecuta su prueba entre cada cambio, supongo que encontrará lo que faltaba.

Si tienes que ir de nuevo a una interfaz interna, tenga en cuenta que su estado de cuenta InternalsVisibleTo debe estar en la misma Asamblea que su interfaz interna, no su aparato de pruebas. También tenga en cuenta que si su ensamblaje es strongly named, puede que necesite agregar una huella digital de clave pública a su declaración InternalsVisibleTo como described in MSDN.

+0

Gracias por su esfuerzo, pero incluso su ejemplo falla para mí con el mismo error. (¡En un nuevo proyecto/solución con solo esta clase!) O me falta algo obvio o quizás tenga que ver con la versión de Moq/NUnit/.NET Framework. ¿Puede confirmar qué versiones estaba usando para su prueba? – Brendan

+0

Además de esto, el mismo código dirigido a 3.5 con Moq 3.1.416 pasa la prueba bien ... Así que estoy ansioso por saber si tu ejemplo funciona con .NET Framework 4.0 – Brendan

+0

Bien, así que después de jugar más, he encontrado que la versión de Moq está marcando la diferencia. Hasta ahora, estaba usando 4.0.10810.8 y siempre estaba fallando con este error. ¡Tan pronto como elimine la referencia a esta versión y luego la referencia 4.0.10501.6 todo se vuelve verde! Así que gracias a ladenedge por su respuesta, lo marcaré como la respuesta porque usted es el único que ha intentado ayudarme hasta ahora. – Brendan

4

Sí, tuve el mismo problema con Moq.4.0.10810.8 para NET40 ... Cuando me degradaron a la versión 4.0.10531.7 todo volvió a ponerse verde.

+0

Gracias! Estoy usando este también y tuve el mismo problema en los últimos dos días. La degradación lo resolvió de inmediato. – reach4thelasers