2011-10-10 4 views
5

Attualmente sto scrivendo un quadro di test unitario che alla fine eseguirà test unitari standard scritti in Visual Studio. Al momento il Framework non funziona correttamente con gli accessor. Si consideri il seguente metodo di prova:Creazione di un'istanza di accesso classe

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

In questo esempio, l'accessorio è stato generato da Visual Studio. Il test dell'unità funziona perfettamente quando viene eseguito utilizzando l'ambiente di test unità di Visual Studio. Tuttavia, vorrei invocare il TestMethod() dal mio Framework. Alla riga "target = new ExampleMethods_Accessor()", viene generata la seguente eccezione:

Il tipo di inizializzatore per "Proband.ExampleMethods_Accessor" ha generato un'eccezione.

Eccezione interna:

Impossibile caricare il file o il montaggio: Proband, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null ...

Qualcuno ha un'idea di come Microsoft Unit Testing Framework invoca test unitari? Stavo pensando che potrebbe essere dovuto all'oggetto TestContext mancante. Questo è "nullo" nel mio caso. All'avvio dell'unità test in Visual Studio, l'oggetto TestContext contiene molte informazioni. Potrebbe essere, che ho bisogno di inizializzarlo correttamente? Come dovrebbe essere inizializzato?

Grazie per tutto l'aiuto, Christian

EDIT:

ho continuato a sperimentare con il modo di accesso stanno lavorando. Ho usato ILSpy per vedere quale codice viene generato nel Proband_Accessor.dll. Si scopre che l'istruzione che causa l'eccezione è:

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

ho modificato il mio codice di unit test per essere come questo (solo per test):

[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(); 
    } 

io assolutamente non capisco, perché "nuova PrivateType ("Proband, versione ...." non funziona. qualcuno ha un'idea?

+0

Qual è l'assemblea 'Proband', e come avete cercato * * per renderlo disponibile? –

+0

cosa stai scrivendo esattamente? sembra che tu stia usando il framework MSTest, dal tuo uso di [TestMethod]. Stai scrivendo una sorta di test personalizzato _runner_? –

+0

Oh mi dispiace per non aver spiegato: l'assembly proband è quello contenente il codice che dovrebbe essere testato. ExampleMethods è una classe all'interno dell'assembly proband, che contiene i metodi privati ​​("SomeMethod"). – Christian

risposta

1

sono riuscito a creare una soluzione per il problema.

per il mio dominio di applicazione, sto aggiungendo un AssemblyResolv eEventHandler:

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

gestore di questo evento contiene il seguente codice:

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

Ora la riga di codice "target = new ExampleMethods_Accessor();" funziona bene e restituisce l'oggetto di accesso corretto.

Ancora non capisco, perché l'Assemblea non può essere risolta automaticamente.

Anche se è molto improbabile che qualcuno avrà lo stesso problema: Spero che questa risposta aiuta qualcuno :)

0

non sto facendo nulla di altrettanto complessa, ma ho avuto:

  1. web progetto applicativo utilizzando .NET 3.5 progetto Configurazione
  2. utilizzando NET 3.5 progetto di prova
  3. utilizzando .NET 3,5

mi è stato sempre la stessa eccezione BadImageFormat quando si tenta di eseguire un test di unità utilizzando una funzione di accesso.

ho trovato il seguente link:

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

Il secondo work-around risolto il mio problema. Ho cambiato il progetto di test su .NET 4.0 e ha funzionato.

+0

Grazie per l'input, proverò con il test di collaudo .NET 4.0. – Christian

0

Ho appena avuto questo problema esatto, ed è stato perché ho rimosso l'attributo DeploymentItem dal metodo di prova. Una volta che l'ho aggiunto di nuovo, non ho più avuto l'errore sul computer di costruzione.

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

Nota: non ho mai ricevuto l'errore eseguendolo localmente.

Questo è l'errore:

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.