it-swarm-eu.dev

Errore durante la generazione di falsi con ITuple

Abbiamo utilizzato il framework Microsoft Fakes nella nostra soluzione per molto tempo per simulare System.DateTime.UtcNow durante i test.

Più di recente, anche se diverse settimane fa, abbiamo iniziato a utilizzare le funzionalità C # 7 (con VS 2017), comprese le tuple come valori di ritorno dalle funzioni. Ora, ho creato una nuova filiale per un rilascio. Nel nuovo ramo, la generazione di falsi fallisce con più messaggi sotto

4>C:\Users\...\Source\... 2017\DEV\WebApp.UnitTests\f.cs(116674,53): error CS0234: The type or namespace name 'ITuple' does not exist in the namespace 'System.Runtime.CompilerServices' (are you missing an Assembly reference?) [C:\Users\...\Source\... 2017\DEV\WebApp.UnitTests\obj\Debug\Fakes\m\f.csproj] 4>C:\Users\...\Source\... 2017\DEV\WebApp.UnitTests\f.cs(116674,13): error CS0538: 'ITuple' in explicit interface declaration is not an interface [C:\Users\...\Source\... 2017\DEV\WebApp.UnitTests\obj\Debug\Fakes\m\f.csproj]

Ho provato questo:

  • Aggiungi Microsoft.Net.Compilers 2.4.0 NuGet a tutti i progetti
  • Aggiorna tutti i progetti per raggiungere .NET 4.7 (dalla 4.6.1) e rimuovere tutti i riferimenti System.ValueTuple (visto che ora sono integrati in .NET 4.7)

Non sono sicuro di cos'altro provare. Non abbiamo riscontrato questo problema quando abbiamo iniziato a utilizzare tuple e aggiunto il pacchetto System.ValueTuple NuGet. Abbiamo notato solo il problema durante la creazione di un nuovo ramo. Suppongo che la costruzione di FakesAssemblies o il ripristino dei pacchetti NuGet debbano aver attivato qualcosa.

Da allora, abbiamo anche notato che si verifica quando ricostruiamo la soluzione.

EDIT: Ho anche provato a rimuovere tutti gli assembly, i riferimenti e la configurazione di Fakes e ricominciare da capo. Stesso risultato.

9
SvenAelterman

La soluzione si è rivelata indirizzata a .NET Framework 4.7.1. Per i documenti (RTFM, lo so ...), ITuple è definita in System.Runtime.CompilerServices per la prima volta in quella versione:

https://msdn.Microsoft.com/en-us/library/system.runtime.compilerservices.ituple(v=vs.110).aspx

.NET Framework

Disponibile dal 4.7.1

4
SvenAelterman

Puoi ignorare ITuple nel file mscorlib.fakes:

<Fakes xmlns="http://schemas.Microsoft.com/fakes/2011/">
  <Assembly Name="mscorlib" Version="4.0.0.0"/>
  <StubGeneration>
    <Remove FullName="System.Runtime.CompilerServices.ITuple"/>
  </StubGeneration>
</Fakes>

* Nota: l'elemento <StubGeneration> precede l'elemento <ShimGeneration>

13
sompet

Stavo ricevendo gli stessi errori riferiti a ITuple, ma l'errore che ho fatto per causarli è stato piuttosto sciocco. Cosa ha riparato la mia build, per altri che potrebbero aver commesso lo stesso errore:

  • Verificare che gli shim dichiarati siano nel file .fakes corretto. Ad esempio, il mio shim DateTime:

    <ShimGeneration>
      <Add FullName="System.DateTime!" />
    </ShimGeneration>
    

    è stato inserito accidentalmente in System.fakes anziché in mscorlib.fakes.

0
P. Jindra