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.
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% 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:
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:
Im obigen Code wenden wir eine Funktion an, die ein MatcherResult
zu einer Folge von Werten :
Beachten Sie Folgendes:
f
ist ein Expectable[A => Double]
, also müssen wir seine tatsächliche value
verwenden, um sie verwenden zu können
Ä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:
Die vererbte result
-Methode, die ein MatchResult
erstellt (was die apply
-Methode von Matcher
zurückgeben sollte
übergibt einen booleschen Spruch, wenn die Ausführung von beCloseTo
erfolgreich war: .isSuccess
übergibt es schön formatierte "ok" und "ko" Nachrichten, basierend auf der Eingabe und der Ergebnisnachricht des beCloseTo
übereinstimmenden
Übergeben Sie es an die Expectable
, die für den Abgleich zuerst verwendet wurde: f
, sodass das Endergebnis den Typ MatchResult[A => Double]
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):
Sie können % co_de verwenden % anstelle von foreach
, wenn Sie alle Fehler erhalten möchten:
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%