Wie man die Konstruktion neuer Objekte durch Nunit vereitelt - c #, nunit

Ich möchte einen Nunit-Test schreiben, um eine Methode zu testen, aber ich bin nicht in der Lage, ein in dieser Methode instanziiertes Objekt zu verspotten.

Hier ist der Code:

public class Converter()
{
public void modifyScore(string convertTo){
ScoreConverter scoreConverter;
if(convertTo.Equals("decimal"){
scoreConverter = new DecimalScoreConverter();
scoreConverter.determineScore();
}
else{
scoreConverter = new IntegerScoreConverter();
scoreConverter.determineScore();
}
}

Ich möchte einen Test für modifyScore schreiben und testen, welche Methode die Methode aufgerufen hat.

Wie kann ich diese Methode mit Nunit testen?

Antworten:

0 für die Antwort № 1

Zunächst sollten Sie gegen Abstraktionen arbeiten. Ich denke, dass dies für alle Mock-Frameworks benötigt wird. Von den Informationen, die Sie mir gegeben haben, und ein paar Annahmen:

Wie auch immer, hier gehen wir:

public Interface IConverter
{
IScoreConverter ScoreConverter { get; set; };//use constructorinjection instead
void ModifyScore(string convertTo);
}

public Interface IScoreConverter
{
DetermineScore();
}

Ich würde empfehlen, einen Blick darauf zu werfen MoQ.

Sie müssen herausfinden, was Sie vom inneren Objekt zurückgeben möchten. Fürs Erste gibst du keinen Wert von ModifyScore zurück, also hast du nichts zu testen.

Wenn Sie z.B. eine Zeichenfolge, könnte der Test so aussehen:

var scoreConverterResponse = "theStringYouWantToBeReturned"

var scoreConverterMock = new Mock<IScoreConverter>();
scoreConverterMock.Setup(sc => sc.DetermineScore())
.Returns(scoreConverterResponse);

scoreConverterMock.Verify(sc => sc.DetermineScore(It.IsAny<string>()), Times.AtLeastOnce());

Ich habe die Namenskonventionen, d. H. CamelCase-Methoden, festgelegt. Ich habe das sofort geschrieben, also entschuldige ich mich, wenn Kompilierungsfehler vorliegen.


-1 für die Antwort № 2

Unit-Tests basieren meist auf Zustandsänderungen. Der natürliche Weg ist also:

  • Mach was in einer Klasse
  • Testen Sie, ob sich der Status der Klasse wie erwartet geändert hat

Vielleicht können Sie eine Änderung in Ihrem Code erwägen, um den Typ von scoreConverter zu testen:

public class Converter
{
public ScoreConverter scoreConverter { get; set; }

public void modifyScore(string convertTo){

if(convertTo.Equals("decimal"){
scoreConverter = new DecimalScoreConverter();
}
else{
scoreConverter = new IntegerScoreConverter();
}
scoreConverter.determineScore();
}

Ihr Test kann dann die modifyScore () -Methode ausführen und dann den Typ der scoreConverter-Variable bestätigen.

Wenn Sie das Objekt nicht veröffentlichen möchten, besteht eine andere Möglichkeit darin, es intern zu machen und dann das Objekt hinzuzufügen InternalsVisibleToAttributeoder vielleicht, um eine Factory-Klasse zu verwenden und dann im Test zu verspotten, wie amcdermott darauf hingewiesen hat.

Schöne Grüße!