3 Stimmen

Wie kann ich Unit Tests für eine Methode schreiben, die einen Aufruf einer Basismethode im Basismodell hat

Ich habe den folgenden Code:

class MyBase
{
    public virtual void foo()
    { ... }
}

class MyDerived : MyBase
{
   public override void foo()
   {
       ...
       base.foo();
       ...
   }
}

Wie kann ich die Methode foo in der MyDerived-Klasse testen, ohne die base.foo() Methode auszuführen?

13voto

Jon Skeet Punkte 1325502

Sie können es im Grunde genommen nicht. Testen Sie die Basisklassenmethode separat, damit Sie Vertrauen in diese haben, und dann können Sie die abgeleitete Klasse testen, die auf dem Verhalten der Basisklasse beruht.

(Dies ist ein weiterer Fall, in dem die Komposition mehr Kontrolle bietet als die Vererbung - wenn Ihre abgeleitete Klasse die Basisklasse kompiliert hätte, könnten Sie stattdessen einen Mock oder ähnliches verwenden. Das ist natürlich nicht immer angemessen, aber...)

2voto

diversemix Punkte 569

Wie wäre es, MyDerived zu refaktorisieren, um die Methoden DoPreFoo() und DoPostFoo() zu haben? Auf diese Weise kann foo umgeschrieben werden, um diese Funktionen aufzurufen, die Sie für Ihre Unit-Tests verwenden können. Allerdings fühlt sich das ein bisschen hässlich an. Ich habe das Gefühl, dass MyDerived MyBase aggregieren muss und nicht von ihm abgeleitet werden sollte, wenn die Funktionalität separat getestet werden muss.

1voto

ppiotrowicz Punkte 4194

Kurze Antwort: Du kannst es nicht. Weil du diese Abhängigkeit nicht "wegmocken" kannst.

Vielleicht hat TypeMock Isolator einige magische Profil-API-Tricks, die hier helfen können, aber ich bin mir nicht sicher.

1voto

Morten Punkte 3674

Wenn Sie nicht möchten, dass Ihre Basismethode im Test ausgeführt wird, stimmt etwas nicht mit Ihrem Design.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X