it-swarm.dev

Fehler beim Erzeugen von Fälschungen mit ITuple

Wir haben das Microsoft Fakes-Framework in unserer Lösung seit langem verwendet, um System.DateTime.UtcNow während des Tests zu fälschen.

In den letzten Jahren, vor einigen Wochen, haben wir begonnen, C # 7-Funktionen (mit VS 2017) zu verwenden, einschließlich Tupeln als Rückgabewerte von Funktionen. Nun habe ich einen neuen Zweig für ein Release erstellt. Im neuen Zweig schlägt das Generieren von Fälschungen mit mehreren der nachstehenden Nachrichten fehl

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]

Ich habe das ausprobiert:

  • Fügen Sie allen Projekten Microsoft.Net.Compilers 2.4.0 NuGet hinzu
  • Aktualisieren Sie alle Projekte auf .NET 4.7 (von 4.6.1) und entfernen Sie alle System.ValueTuple-Referenzen (da diese jetzt in .NET 4.7 integriert sind).

Ich bin mir nicht sicher, was ich sonst noch versuchen soll. Dieses Problem ist nicht aufgetreten, als wir zum ersten Mal mit Tupeln gearbeitet haben und das System.ValueTuple NuGet-Paket hinzugefügt haben. Das Problem ist uns erst beim Anlegen einer neuen Filiale aufgefallen. Ich nehme an, dass entweder das Erstellen der FakesAssemblies oder das Wiederherstellen von NuGet-Paketen etwas ausgelöst haben muss.

Seitdem haben wir auch bemerkt, dass es passiert ist, als wir die Lösung neu erstellen.

EDIT: Ich habe auch versucht, alle Fakes-Assemblys, Referenzen und Konfiguration zu entfernen und neu zu starten. Gleiches Ergebnis.

9
SvenAelterman

Es stellte sich heraus, dass die Lösung auf .NET Framework 4.7.1 abzielte. In den Dokumenten (RTFM, ich weiß ...) wird ITuple zum ersten Mal in dieser Version in System.Runtime.CompilerServices definiert:

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

.NET Framework

Verfügbar seit 4.7.1

4
SvenAelterman

Sie können ITuple in der Datei mscorlib.fakes ignorieren:

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

* Hinweis: Das <StubGeneration>-Element steht vor dem <ShimGeneration>-Element

13
sompet

Ich bekam dieselben Fehler, die sich auf ITuple bezogen, aber der Fehler, den ich gemacht habe, war ziemlich dumm. Was hat mein Build behoben, für andere, die möglicherweise denselben Fehler gemacht haben:

  • Stellen Sie sicher, dass die angegebenen Shims in der richtigen .fakes-Datei sind. Zum Beispiel mein DateTime-Shim:

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

    wurde versehentlich in System.fakes anstelle von mscorlib.fakes abgelegt.

0
P. Jindra