Erstellen eines Specs2 Matcher auf modulare Weise

8

Ich habe Funktionen A => Double . Ich möchte überprüfen, ob zwei solche Funktionen die gleichen Ergebnisse (bis zu einer Toleranz, mit dem vorhandenen% Co_de% Matcher) für eine bestimmte Menge von Werten geben.

Ich möchte schreiben können:

%Vor%

Ich möchte diesen Matcher modular aufbauen und nicht einfach ein beCloseTo von Grund auf schreiben.

Es wäre vielleicht noch schöner, wenn ich schreiben könnte:

%Vor%

Ich möchte auch eine vernünftige Beschreibung erhalten, wenn der Matcher ausfällt.

Bearbeiten

Nachdem ich darüber geschlafen habe, kam ich auf Folgendes:

%Vor%

Dies ist viel kürzer als Erics Lösung, liefert aber keine gute Fehlermeldung. Was ich gerne hätte, ist, dass ich den gemappten Wert in der zweiten Methode umbenenne. Etwas wie das folgende (das nicht kompiliert).

%Vor%     
ziggystar 27.10.2011, 13:45
quelle

1 Antwort

9

Wenn Sie Dinge mit der zweiten Version schreiben wollen, müssen Sie eine neue Matcher -Klasse erstellen, die die Funktionalität von beCloseTo matcher einkapselt:

%Vor%

Diese Klasse ermöglicht die Verwendung der folgenden Syntax:

%Vor%

Sehen wir uns nun an, wie Sie den beCloseTo -Matcher in der apply -Methode wiederverwenden:

%Vor%

Im obigen Code wenden wir eine Funktion an, die ein MatcherResult zu einer Folge von Werten :

%Vor%

Beachten Sie Folgendes:

  1. f ist ein Expectable[A => Double] , also müssen wir seine tatsächliche value verwenden, um sie verwenden zu können

  2. Ähnlich können wir nur eine Expectable[T] auf eine Matcher[T] anwenden, also müssen wir die Methode theValue verwenden, um f.value(v) in eine Expectable[Double] umzuwandeln (aus der MustExpectations Eigenschaft)

Schließlich können wir, wenn das Ergebnis von forall übereinstimmt, die Ergebnisnachrichten mithilfe von:

anpassen
  1. Die vererbte result -Methode, die ein MatchResult erstellt (was die apply -Methode von Matcher zurückgeben sollte

  2. )
  3. übergibt einen booleschen Spruch, wenn die Ausführung von beCloseTo erfolgreich war: .isSuccess

  4. übergibt es schön formatierte "ok" und "ko" Nachrichten, basierend auf der Eingabe und der Ergebnisnachricht des beCloseTo übereinstimmenden

  5. Übergeben Sie es an die Expectable , die für den Abgleich zuerst verwendet wurde: f , sodass das Endergebnis den Typ MatchResult[A => Double]

  6. hat

Ich bin mir nicht sicher, wie modularer wir Ihre Anforderungen erfüllen können. Es sieht für mich am besten aus, beCloseTo mit forall zu verwenden.

AKTUALISIEREN

Eine kürzere Antwort könnte etwa so lauten:

%Vor%

Der obige Code erzeugt eine Fehlermeldung wie:

%Vor%

Dies sollte fast out-of-the-box funktionieren. Der fehlende Teil ist eine implizite Umwandlung von A => MatchResult[_] nach Matcher[A] (was ich der nächsten Version hinzufügen werde):

%Vor%

Sie können % co_de verwenden % anstelle von foreach , wenn Sie alle Fehler erhalten möchten:

%Vor%

UPDATE 2

Das wird jeden Tag besser. Mit dem neuesten specs2 Snapshot können Sie schreiben:

%Vor%

UPDATE 3

Und jetzt mit dem neuesten specs2 Schnappschuss können Sie schreiben:

%Vor%

Die Fehlermeldung lautet:

%Vor%     
Eric 27.10.2011, 23:31
quelle

Tags und Links