2011-10-10 17 views
5

Actualmente estoy escribiendo un marco de prueba unitaria que al final ejecutará pruebas de unidad estándar escritas en Visual Studio. El Framework actualmente no está funcionando correctamente con los accessors. Consideremos el siguiente método de ensayo:Creando la instancia del descriptor de acceso de clase

[TestMethod()] 
public void TestMethod() 
{ 
     ExampleMethods_Accessor target = null; 
     target = new ExampleMethods_Accessor(); 
     target.SomeMethod(); 
} 

En este ejemplo, el descriptor de acceso ha sido generado por Visual Studio. La prueba unitaria funciona perfectamente bien cuando se ejecuta utilizando el entorno de prueba de unidad de Visual Studio. Sin embargo, me gustaría invocar TestMethod() desde mi Framework. En la línea "target = new ExampleMethods_Accessor()", se lanza la siguiente excepción:

El inicializador de tipo para "Proband.ExampleMethods_Accessor" lanzó una excepción.

Excepción interna:

No se pudo cargar el archivo o ensamblado: Proband, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null ...

¿Alguien una idea de cómo la Unidad de Pruebas de Microsoft Marco invoca pruebas unitarias? Estaba pensando que podría deberse al objeto TestContext que faltaba. Esto es "nulo" en mi caso. Al iniciar la prueba unitaria en Visual Studio, el objeto TestContext contiene mucha información. ¿Podría ser que necesito inicializarlo correctamente? ¿Cómo debería ser inicializado?

Gracias por toda la ayuda, Cristiano

EDIT:

Seguí experimentando con la forma en descriptores de acceso están trabajando. Usé ILSpy para ver qué código se está generando en Proband_Accessor.dll. Resulta que la instrucción que causa la excepción es:

SomeClass_Accessor.m_privateType = new PrivateType("Probant, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "Probant.SomeClass"); 

he modificado mi código de prueba de unidad que ser así (sólo para pruebas):

[TestMethod()] 
    [DeploymentItem("Proband.dll")] 
    public void SomeMethodTest() 
    { 
     ExampleMethods_Accessor target = null; 
     ExampleMethods c = null; 

     try 
     { 
      Assembly.Load("Proband, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); // this works fine 
      PrivateType tx = new PrivateType(typeof(ExampleMethods)); // this works fine as well (also without loading the assembly) 

      PrivateType t = new PrivateType("Proband, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "Proband.ExampleMethods"); // this causes the exception 

      c = new ExampleMethods(); // this works fine 
      target = new ExampleMethods_Accessor(); // this causes the exception as well 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(); 
     } 
     int actual; 
     actual = target.SomeMethod(); 
    } 

yo absolutamente no entiendo, ¿por qué "nueva PrivateType ("Proband, Versión ...." no funciona. ¿alguien una idea?

+0

¿Cuál es el conjunto 'Proband', y cómo han intentado usted * * para que esté disponible? –

+0

¿Qué estás escribiendo exactamente? parece que estás usando el framework MSTest, desde tu uso de [TestMethod]. ¿Estás escribiendo algún tipo de prueba personalizada _runner_? –

+0

Oh, lo siento por no explicar: El ensamblaje proband es el que contiene el código que debe probarse. ExampleMethods es una clase dentro del ensamblado proband, que contiene los métodos privados ("SomeMethod"). – Christian

Respuesta

1

he conseguido crear una solución para el problema.

para mi dominio de aplicación, estoy añadiendo un AssemblyResolv eEventHandler:

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler); 

manejador Este evento contiene el siguiente código:

private Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) 
    { 
     if(args.Name == "Proband, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null") 
     { 
      // resolving correct assembly of type under test 
      return typeof(ExampleMethods).Assembly; 
     } 
     else 
     { 
      return null; 
     } 
    } 

Ahora la línea de código "target = new ExampleMethods_Accessor();" funciona bien y devuelve el objeto de acceso correcta.

Todavía no entiendo por qué el ensamblaje no se puede resolver automáticamente.

Aunque es muy poco probable que alguien va a tener el mismo problema: Espero que esta respuesta ayude a alguien :)

0

no estoy haciendo nada tan complejo, pero que tenía:

  1. Web proyecto de aplicación usando .NET 3.5
  2. proyecto Configuración a través de proyectos de prueba .NET 3.5
  3. utilizando .NET 3,5

que estaba recibiendo la misma excepción BadImageFormat al intentar ejecutar una prueba de unidad utilizando un descriptor de acceso.

me encontré con el siguiente enlace:

http://connect.microsoft.com/VisualStudio/feedback/details/677203/even-after-installing-vs2010-sp1-unit-tests-targeting-3-5-framework-fail-if-they-are-using-private-accessor#details

El segundo trabajo en torno resolvió mi problema. Cambié el proyecto de prueba a destino .NET 4.0 y funcionó.

+0

Gracias por la entrada, intentaré esto con el ensamblado de prueba .NET 4.0. – Christian

0

Acabo de tener este problema exacto, y fue porque eliminé el atributo DeploymentItem del método de prueba. Una vez que lo agregué nuevamente, ya no recibí el error en la máquina de compilación.

[TestMethod] 
[DeploymentItem("FedImportServer.dll")] // ** This is necessary for the build machine. ** 
public void SourceFileStillExistsAfterProcessingFails() 

Nota: Nunca recibí el error al ejecutarlo localmente.

Este es el error:

Test method FedImportTests.FedImportServiceHostTest.FileNoLongerExistsAfterSucessfulProcessing threw exception: System.TypeInitializationException: The type initializer for 'FedImportServer.Processing.FileProcessor_Accessor' threw an exception. ---> System.IO.FileNotFoundException: Could not load file or assembly 'FedImportServer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.

Cuestiones relacionadas