Wie schreibe ich generische Tests für alle Implementierungen einer Schnittstelle mit MSpec?

8

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:

  1. Verwenden Sie die verzögerte Ausführung
  2. Ändern Sie nicht die Eingabe-Beispiele

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):

%Vor%

Ist so etwas möglich?

    
Daniel Hilgarth 11.11.2011, 17:45
quelle

2 Antworten

2

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).

%Vor%

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.

    
Anthony Mastrean 16.11.2011 05:52
quelle
0

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%     
Alex Norcliffe 15.11.2011 12:51
quelle

Tags und Links

yii\base\ErrorException
Copied! Copy Stacktrace Search Stackoverflow Search Google Error

PHP Core Warningyii\base\ErrorException

PHP Startup: Unable to load dynamic library 'mongodb.so' (tried: /usr/lib64/php/modules/mongodb.so (/usr/lib64/php/modules/mongodb.so: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/mongodb.so.so (/usr/lib64/php/modules/mongodb.so.so: cannot open shared object file: No such file or directory))

$_GET = [
    'id' => '400181',
    'url' => 'how-do-i-write-generic-tests-for-all-implementations-of-an-interface-with-mspec',
];

$_COOKIE = [
    'advanced-frontend' => '09befc8d8cfc4513a7adbd87f2e0fb5c',
    '_csrf-frontend' => '8ab95e407009ed987e74d64ea45d33fd84de47d4f2ea20f3d4b3819b946917b0a:2:{i:0;s:14:"_csrf-frontend";i:1;s:32:"wDSst4rdwvF8OKDtUZAXX_Ou9Ttcph-m";}',
];

$_SESSION = [
    '__flash' => [],
];