2017-03-09 2 views
2

Ich verwende C#, xUnit und Moq für Komponententests. Ich habe ein Objekt mit einer komplexen Eigenschaft. Um „klar“ das Eigentum und alle seine Eigenschaften, ich dies tun:Wie testen Sie, dass eine neue Instanz eines Objekts erstellt wurde?

this.ComplexTypeInstance = new ComplexType(); 

Jetzt versuche ich zu behaupten, dass ComplexTypeInstance zu einem ganz neuen Objekt zugewiesen wurde. Mein erster Gedanke war, ComplexTypeInstance mit new ComplexType() zu vergleichen und festzustellen, ob sie gleich sind. Aber um so etwas zu tun, müsste ich den Operator "Gleich" überschreiben. Gibt es eine Möglichkeit, leicht zu überprüfen, ob alle Eigenschaften auf ihre Standardwerte festgelegt sind? Oder gibt es eine Möglichkeit zu behaupten, dass ich das Objekt überarbeitet habe?

Antwort

6

Oder gibt es eine Möglichkeit zu behaupten, dass ich das Objekt neu erstellt habe?

Vergleichen Sie einfach die Referenzen zwischen der alten und der neuen mit ReferenceEquals. Wenn sie unterschiedlich sind, wurde die Eigenschaft ersetzt.

var origInstance = this.ComplexInstance; 
... // Some operation 
Assert.False(object.ReferenceEquals(this.ComplexInstance, origInstance)); 
0

darüber ein wenig Nach einigem Nachdenken, gab es ein paar verschiedenen Szenarien ich damit leichten Test machen kam:

  1. Wickeln Sie das Complex in einer Fabrik Art von Verfahren. Ich mochte das nicht, es bedeutet nur eine weitere Klasse zu schaffen, und ich wollte vermeiden, eine so einfache Fabrik zu haben.

  2. Extrahieren und überschreiben - Erstellen Sie eine virtuelle Methode, mit der ich die konkrete Abhängigkeit entfernen kann. Google "Extrahieren und überschreiben", wenn Sie Fragen haben. Ich mag dieses B/C nicht, wenn du die Technik nicht kennst, kann es komisch scheinen.

  3. Injizieren Sie eine anonyme Funktion, die eine neue Instanz des Objekts zurückgibt.

  4. Ein Mitarbeiter erwähnte, ich hätte Mark Seemanns SemanticComparison auch verwenden können, um meine Eigenschaft mit einem neuen Objekt zu vergleichen.

Ich landete mit der dritten Option geht es durch den Konstruktor Injektion, obwohl meine IOC-Container nicht leicht lösen konnte, und ich hatte ein paar Minuten damit verbringen, um es zu bekommen eine Bindung für ihn zu lösen . Aber ich habe es ziemlich gut funktioniert. Vielleicht hätte ich die Fabrik gerade erst erschaffen sollen. Aber ich bin froh, dass ich die Abhängigkeit von der Klasse herausgenommen habe. Zuerst wollte ich nicht b/c es schien so einfach.

Verwandte Themen