2012-07-24 11 views
5

Sto solo provando a familiarizzare con il nuovo Fakes Isolation Framework in Visual Studio 2012 RC ma di conseguenza ho problemi con ShimNotSupportedException s.
Al primo tentativo, ogni singolo metodo di shim a cui ho cercato di collegare un delegato, aveva lanciato un ShimNotSupportedException durante il tentativo di eseguire/eseguire il debug del test.ShimNotSupportedException in MS VisualStudio 2012

[TestMethod] 
public void GetFoo_ValidBar_ReturnsBaz() 
{ 
    using(ShimsContext.Create()) 
    { 
     ShimDateTime.NowGet =() => new DateTime(2012,08,11,10,20,59); 

     const string expected = "20120811_102059"; 
     string actual = GetFoo(); 

     Assert.AreEqual(expected,actual); 
    } 
} 

Questa è la corrispondente stack:

Procedimento prova GetFoo_ValidBar_ReturnsBaz ha generato un'eccezione: Microsoft.QualityTools.Testing.Fakes.Shims.ShimNotSupportedException: System.DateTime a Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.InvokeEvent (valore T, Azione1 eh) in Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.OnAttachedUnsupported Metodo (metodo MethodBase) a Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.CheckInstrumentation (MethodBase metodo) a Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.InternalAttachDetour (Object optionalReceiver, metodo MethodBase, delegato detourDelegate) a Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.AttachDetour (Object optionalReceiver, metodo MethodBase, delegato detourDelegate) a Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShimMethod (delegato optionalStub, oggetto optionalReceiver, Metodo MethodBase) in Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShim (Delegato optionalStub, Tipo receiverType, oggetto optionalReceiver, String name, bandiere ShimBinding, Tipo returnType, digitare [] parameterTypes) a Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShimPublicStatic (Delegato optionalStub, Tipo receiverType, String name, Tipo returnType, digitare [] parameterTypes) al System.Fakes.ShimDateTime.set_NowGet (valore Func'1) a GetFoo_ValidBar_ReturnsBaz() in BazTests.cs: linea 48.

Dopo aver letto le due filettature Ho trovato a MSDN che si occupa di questo problema ho seguito le loro istruzioni (disattivando CodeCoverage, eliminando .testsettings f ile) che non ha funzionato per me!
Tuttavia, ho trovato una soluzione per questo problema:
Eseguendo tutti i test dall'esploratore di test (invece di utilizzare il pulsante "MSTest Test (clic per eseguire)" direttamente dall'area di codifica), tutto ha funzionato correttamente e no sono state lanciate eccezioni. Successivamente ho anche potuto eseguire il debug del test e l'assegnazione al metodo shim ha funzionato esattamente come previsto.
Questo ha funzionato per tutti i seguenti spessori che ho usato anch'io.
Ma ora sto riscontrando di nuovo lo stesso problema quando si tenta di implementare i falsi della libreria MS Enterprise per l'accesso al database.

Questo è ciò che il test si presenta come:

[TestMethod] 
public void GetFooFromEF_NonEmptyDataReader_ObjectsCorrectlyInstantiated() 
{ 
    using(ShimsContext.Create()){ 
     var dataReader = new StubIDataReader() 
      { 
       ItemGetString = s => 1, 
       DepthGet =() => 2 
      }; 

     ShimFoo.GetBar = guid => dataReader; 

     var bar = new StubIBar() 
     { 
      ConvertIBarToBaz = record => null 
     }; 

     ShimQux.AllInstances.GetBar = (a, b) => bar; 

     var dbFactory = new StubDbProviderFactory(); 
     var db = new StubDatabase("test", dbFactory); 
     ShimDatabaseFactory.CreateDatabaseString = s => db; 

     List<BarInformation> actual = accessor.InvokeStatic("GetBar", 
                   new Object[] { }) as List<BarInformation>; 
     Assert.IsTrue(true); 
    } 
} 

I primi due assegnazioni di spessore (ShimFoo & ShimQux) funzionino come previsto. Ma ShimDatabaseFactory.CreateDatabaseString (che dovrebbe rendere DatabaseFactory.CreateDatabase (string) restituisce un database stub quando si tenta di creare una nuova istanza di database) genera nuovamente una ShimNotSupportedException. E proprio non riesco a capire perché!
Hai qualche idea di cosa è andato storto qui?

Apprezzerei qualsiasi input su questo.

Grazie,
Benjamin

+0

Solo un avvertimento, è necessario eseguire VS come amministratore. –

risposta

4

Ho avuto lo stesso problema esatto. Prova a rimuovere tutti i file testettings (sia dal disco che dalla soluzione) e assicurati che la tua soluzione non faccia riferimento a nessun file di test.

Assicurati anche che tu stia utilizzando lo studio visivo testrunner (e non il programma di ricerca ecc. Che sta strumentando il codice).

Ho scritto due blogposts su questi temi che possono essere utili:

Visual Studio 2012 Fakes – ShimNotSupportedException when debugging tests

Unit testing – Visual Studio 2012 Fakes in Team City

+0

ReSharper era il problema per me. – MasterMastic

1

che ho visto questo errore di un certo numero di volte con diverse cause:

  • C'è un errore o un problema nei file di generazione dei falsi, alcuni di essi non sono stati generati correttamente. Pulire le directory e rifare i riferimenti falsi
  • Manca una DLL dipendente. In questo caso ti manca una dll da cui dipende una DLL di falsi. In un caso stavo spremendo un webservice e mancava la dll System.ServiceModel.
  • A volte è possibile risolvere il problema cambiando il test di default del processore architecure. Tuttavia non so perché, probabilmente aggiornerà alcuni dll in cache.
Problemi correlati