Frage

Also ich habe eine Klasse, die etwa wie folgt aussieht:

public class MyClass
{

    DatabaseDependency _depend;

    public MyClass(DatabaseDependency depend)
    {
        _depend = depend;
    }

    public string DoSomething(DBParameter database)
    {
        var result = _depend.GetResults(database, ...);
        string response = String.Empty;        

        // some logic to process the result 

        return response;
    }

}

Wo DBParameter eine einfache Wert Klasse ist, die Eigenschaften wie Server enthält, DBName, DBType, etc.

Nun, ich möchte eine Überlastung zu DoSomething hinzufügen, so dass es eine Verbindungszeichenfolge anstelle des DBParameter Parameter akzeptiert (unter der Annahme, dass DatabaseDependency bereits eine GetResults Überlastung hat, die eine Verbindungszeichenfolge akzeptiert).

Meine Frage: Ich habe mehrere Unit-Tests haben, die die verschiedenen logischen Pfade beschreiben resultieren aus DatabaseDependency.GetResults zu verarbeiten. Wenn ich die Überlastung DoSomething hinzufügen, würde ich im Wesentlichen den Code Refactoring, so dass diese Logik durch beiden Überlastungen wieder verwendet wird (das heißt es wahrscheinlich zu einer privaten Methode bewegen). Was ist der richtige Weg, um Einheit zu gehen, diese zu testen? Muss ich nur so viele Unit-Tests haben alle logischen Pfade für die neue Überlastung zu überprüfen ich hinzufügen?

War es hilfreich?

Lösung

Wenn Sie sich sicher sind, dass Ihr überladene Methode einen String gerade dabei wandelt in ein Verbindungsobjekt und dann die Delegierten zum Original, sollten Sie eine weitere Testverfahren hinzuzufügen.

Doch diese bricht, wenn Sie die zugrunde liegenden überladenen Methoden Refactoring, so dass keine Delegation stattfindet. In diesem Szenario würde ich sicherer fühlen alle Tests für beide Methoden zu replizieren.

Ich denke, die erste Route die pragmatischsten ist. Allerdings ist es eine gute Idee, Code-Coverage-Analyse ab und laufen, und dass zu einem späteren Zeitpunkt zeigen, wenn weitere Tests erforderlich sind.

Andere Tipps

Wenn Ihr Code so bleibt es zur Zeit aussieht, dann ja. Sie Unit-Test, dass Verfahren auch benötigen, im Wesentlichen Ihren Testaufwand Duplizieren

Allerdings, wenn es Sinn macht, um die Funktionalität zu implementieren, so dass ein Verfahren einfach die andere nennt, könnten Sie, dass andere Verfahren virtuellen machen. Das würde ermöglichen es Ihnen, eine Testspezifische Unterklasse zu erstellen, in dem Sie einfach überprüfen, ob die virtuelle Methode durch das andere Verfahren mit den korrekten Werten aufgerufen wird.

Sobald das durch einen oder mehrere Komponententests überprüft wird, brauchen Sie nicht, dass die Methode weiter zu testen, denn jetzt haben Sie bewiesen , dass das Verfahren korrekt die andere Methode aufruft, und Sie können konzentrieren Ihre Testaufwände auf dieser Methode.

Ja, Refactoring der gemeinsame Verarbeitung zu einer privaten Methode - Ich gehe davon aus, dass Sie dies ohnehin unabhängig von Test Überlegungen tun würden, doppelte Code schlecht ist. Es ist interessant, wie zum Testen Denken führt uns, das Richtige zu tun.

Dann haben Sie ein paar einfache Tests für jeden overlaoded Initiations Weg.

Hängt, wenn Sie Black-Box oder White-Box-Tests und auch tun, wenn Sie Anwendung beiden Versionen des Verfahrens.

Wenn Sie davon aus, dass Sie gerade Implementierung zu testen, dann einfach die Prüfung der ‚Haupt‘ Version wäre in Ordnung. Wenn Sie entlang der Linien eines Test Schriftsteller denken, die über die präsentierten API (javadocs oder ähnliches) nur weiß, dann müssen Sie nur auf Basis der API testen, die beide Methoden vollständig impliziert testen.

Wenn Sie Anwendung sind nur eine Methode verwendet, dann die andere verbitten und eine Version bedingten Test erstellen, schlägt fehl, wenn die veraltete Methode existiert immer noch an einem gewissen vorbestimmten Version. IE:. Erzwingen, dass die veraltete Methode an einem gewissen Punkt entfernt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top