Ich habe eine Schnittstelle IAudioProcessor
mit einer einzigen Methode IEnumerable<Sample> Process(IEnumerable<Sample> samples)
. Obwohl es keine Voraussetzung für die Schnittstelle selbst ist, möchte ich sicherstellen, dass alle meine Implementierungen einigen gemeinsamen Regeln folgen, wie zum Beispiel:
Es ist nicht schwer, Tests für diese zu erstellen, aber ich müsste diese Tests für jede Implementierung kopieren und einfügen. Ich möchte das vermeiden.
Ich möchte so etwas machen (beachte das Attribut GenericTest
und den Typparameter):
Ist so etwas möglich?
Ich bin mir ziemlich sicher, dass Sie nach Verhaltensweisen suchen (siehe auch Test mit Verhaltensweisen testen ). Sie definieren die Verhaltensweisen, die jede Implementierung erfüllen sollte (die It
-Felder) in einer speziellen Klasse, die das SUT und unterstützende Felder teilen (falls erforderlich).
Jede Ihrer Implementierungen muss deklarieren, dass sie sich wie diese spezielle Klasse verhalten. Sie hatten bereits eine ziemlich komplizierte Basisklasse mit gemeinsamem Setup und Verhalten, also werde ich sie verwenden (ich bevorzuge ein einfacheres, expliziteres Setup).
%Vor%Ihre Basisklasse definiert das allgemeine Setup (Erfassen der Kontextaufzählung), das Verhalten (Verarbeitung mit dem spezifischen Impl über den Typparameter) und das Deklarieren des Verhaltensfeldes (auch dies wird dank des generischen Typparameters ausgeführt für jeden Beton).
%Vor% Zusätzlich erhalten Sie die Ausgabe für jedes der It
-Felder für jede der implementierenden Klassen. Damit sind Ihre Kontext- / Spezifikationsberichte vollständig.
Ich habe MSpec-Tests paramaterisiert für Sie :) Ссылка
>Obwohl es nicht als separater grün / roter Test angezeigt wird, glaube ich nicht, dass Sie irgendetwas daran hindern können, eine Sequenz von Fabriken innerhalb Ihrer einzigen Spezifikation aufzuzählen und das Verhalten für jede Implementierung zu bestätigen. Das bedeutet, dass Ihr Test fehlschlägt, selbst wenn eine Implementierung fehlschlägt. Wenn Sie jedoch eine Parametrisierung durchführen möchten, können Sie eine lockerere Testsuite wie NUnit ausprobieren.
Edit 1: Ich bin mir nicht sicher, ob MSpec die Erkennung geerbter Felder unterstützt, um eine Spezifikation zu bestimmen, aber wenn dies der Fall ist, sollte die Anzahl der "wiederholten" Codes zumindest minimiert werden Verwende ein Attribut:
%Vor%Tags und Links c# unit-testing bdd mspec