Dies ist im Wesentlichen ein Artefakt, wie der C# -Compiler Werttypen behandelt. Während the documentation seems to indicate otherwise, aus der Perspektive von Reflection, hat die Foo-Struktur keine öffentlichen Konstruktoren.
z. Wenn Sie diesen Code ausführen:
var ctors = typeof(Foo).GetConstructors();
Das Ergebnis ist ein leeres Array.
jedoch dieser Code kompiliert:
var f = new Foo();
so könnte man argumentieren, dass AutoFixture Lage sein sollte, eine Instanz von Foo zu erstellen.
Allerdings, am Ende, mutable structs are evil und sollte um jeden Preis vermieden werden. Eine bessere Option ist, die Foo-Implementierung, dies zu ändern:
public struct Foo
{
public Foo(int bar, string baz)
{
this.Bar = bar;
this.Baz = baz;
}
public readonly int Bar;
public readonly string Baz;
}
Wenn Sie dies tun, nicht nur haben Sie jetzt einen (mehr) korrekt Werttyp, aber AutoFixture ist auch in der Lage, eine Instanz ohne weitere Modifikation zu erstellen .
So ist dies ein ziemlich gutes Beispiel für die GOOS Paradigma, die Sie sollten hören Sie Ihre Tests. Wenn sie Reibung zeigen, könnte dies eine Rückmeldung über Ihren Produktionscode sein. In diesem Fall ist dies genau das Feedback, das Sie selbst in den Fuß schießen, weil die Implementierung des Werttyps fehlerhaft ist.
P.S. Selbst wenn Sie die Foo-Struktur wie oben beschrieben "fixieren", was bringt es, sie zu einer Struktur anstelle einer Klasse zu machen? Es enthält immer noch ein Feld für Zeichenketten (Referenztypen). Obwohl die Struktur selbst auf dem Stapel leben wird, wird das Zeichenfolgenfeld immer noch auf Daten im Heap zeigen.
Ich habe this issue als mögliches neues Feature für AutoFixture hinzugefügt.
Wenn Sie die AutoMoq-Anpassung entfernen, macht es einen Unterschied oder nicht? –
Es macht keinen Unterschied. – Rok
Cool - nehmen Sie es in Frage und @Peter Porphy kann seine Spekulation entfernen ... –