Einfache Möglichkeit, den Wert eines einzelnen Konstruktorparameters anzugeben?

8

Gibt es in Autoftixture einen einfachen Weg, ein Objekt mit seinem Konstruktor neu zu erstellen, aber hard-code / den Wert anzugeben, der für einen einzelnen Parameter im Konstruktor verwendet werden soll?

Ich sehe, dass dies mit Eigenschaften gemacht werden kann, etwa wie folgt:

fixture.Build<MyObj>().With(x=x.Val,"hard coded value").Create()

    
SFun28 05.02.2015, 17:13
quelle

1 Antwort

10

Aus der Diskussion über diese Frage in den Kommentaren:

  

Oft möchte ich ein Objekt neu erstellen, aber ich bin nur um einen einzelnen Parameter besorgt. Vielleicht steuert der Parameterwert eine Berechnung oder Transformation irgendeiner Art. Ich möchte, dass der Wert selbst zufällig ist, aber der Test muss wissen, welcher Zufallswert gewählt wurde.

Unter der Annahme, dass dies das zugrunde liegende Problem ist, werde ich versuchen, dieses Problem zu beheben.

Fragen Sie das Objekt

Die einfachste Lösung besteht darin, das Objekt einfach zu fragen, was der Wert ist, nachdem AutoFixture es erstellt hat:

%Vor%

Wenn Sie müssen nur wissen, was der besondere Wert ist, aber Sie brauchen es nicht einen bestimmten Wert zu haben, können Sie diese Technik verwenden.

Das ist offensichtlich erfordert, dass Sie den Wert aus dem Konstruktor Parameter als (schreibgeschützt) Immobilie zu belichten, aber das ist Eine gute Idee, trotzdem zu machen .

Weisen Sie den Wert nach der Erstellung zu

Wenn der Parameter einen bestimmten Wert haben soll, können Sie ihn nach der Erstellung zuweisen:

%Vor%

Dies erfordert, dass Sie den Wert als schreibbare Eigenschaft verfügbar machen. Während ich persönlich kein großer Fan davon bin, denn das ist das Objekt wandelbar macht, bereits viele Menschen ihre Objekte entwerfen, die Art und Weise, und wenn das der Fall ist, warum nicht nutzen es?

Verwenden Sie copy-and-update nach der Erstellung

Wenn Sie möchten, dass Ihre Objekte unveränderbar sind, können Sie immer noch eine Variation der obigen Technik verwenden. In F # können Sie sogenannte kopieren und zu aktualisieren Ausdrücke das gleiche Ziel zu erreichen. In F # wäre es etwa so:

%Vor%

Sie können dies, indem Sie Ihre Klassen in C # emulieren copy-and-update Methoden, so würden Sie in der Lage sein, so etwas zu schreiben:

%Vor%

Dies ist eine Technik, die ich die ganze Zeit in meinem C # -Code verwende. AutoFixture hat eine idiomatische Behauptung solcher Kopieren und Update zu testen Methoden .

Inject einen Wert für einen Parameter

Wenn Sie mit einem festen Wert für einen bestimmten Konstruktorparameter leben können, können Sie dies mit den Bausteinen des AutoFixture-Kernels tun. Dieser Test zeigt, wie:

%Vor%

Dies führt jedoch dazu, dass der Parameter immer für diese fixture -Instanz "Ploeh" ist. Es ist auch refactoring-unsafe, da es auf einer Zeichenfolge basiert, die sich auf den Name des Parameters bezieht.

    
Mark Seemann 06.02.2015 09:49
quelle

Tags und Links