Ist es idiomatische Ruby-ein assert () -Methode, um Rubys Kernel Klasse hinzufügen?

StackOverflow https://stackoverflow.com/questions/147969

  •  02-07-2019
  •  | 
  •  

Frage

Ich erweitere mein Ruby-Verständnis durch ein Äquivalent von Kent Becks xUnit in Ruby-Codierung. Python (das Kent schreibt in) eine assert () -Methode in der Sprache, die intensiv genutzt wird. Rubin nicht. Ich denke, es sollte einfach sein, dies zu fügen, ist aber Kernel der richtige Ort, um es zu setzen?

BTW, Ich weiß von der Existenz der verschiedenen Geräterahmen in Ruby -. Dies ist eine Übung, die Ruby-Idiome zu lernen, anstatt zu „get etwas getan“

War es hilfreich?

Lösung

Nein, es ist nicht eine bewährte Methode. Die beste Analogie () in Ruby zu behaupten, hebt nur

 raise "This is wrong" unless expr

und Sie können Ihre eigene Ausnahmen implementieren, wenn Sie für spezifischere Ausnahme zur Verfügung stellen möchten Handhabung

Andere Tipps

Ich denke, es ist völlig gültig ist in Ruby zu verwenden behauptet. Aber Sie sind zu erwähnen, zwei verschiedene Dinge:

  • xUnit Frameworks assert Methoden für Ihre Tests Erwartungen zu überprüfen. Sie sollen in dem Testcode verwendet werden sollen, nicht im Anwendungscode.
  • Einige Sprachen wie C, Java oder Python, gehören assert Konstruktion soll in den Code Ihrer Programme verwendet werden, Annahmen überprüfen Sie ihre Integrität zu machen. Diese Prüfungen werden in dem Code selbst gebaut. Sie sind keine Testzeit Dienstprogramm, sondern eine Entwicklungszeit ein.

Ich schrieb vor kurzem solid_assert: eine wenig Ruby-Bibliothek einen Ruby-Assertion-Dienstprogramm Implementierung und auch ein Beitrag in meinem Blog erklärt seine Motivation .. Es lassen Sie Ausdrücke in der Form schreiben:

assert some_string != "some value"
assert clients.empty?, "Isn't the clients list empty?"

invariant "Lists with different sizes?" do
    one_variable = calculate_some_value
    other_variable = calculate_some_other_value
    one_variable > other_variable
end    

Und sie können so assert deaktiviert werden und invariant als leere Aussagen bekommen ausgewertet. Dies können Sie jedes Performance-Problem in der Produktion vermeiden. Aber beachten Sie, dass die Pragmatische Programmierer gegen empfehlen, sie zu deaktivieren. Sie sollten sie nur deaktivieren, wenn sie wirklich auf die Leistung auswirken.

auf die Antwort Bezug sagt, dass der idiomatische Ruby-Weg, um eine normale raise Anweisung verwendet, ich glaube, es von Expressivität fehlt. Eine der goldenen Regeln der durchsetzungs Programmierung ist nicht mit Behauptungen für normale Ausnahmebehandlung. Sie sind zwei völlig verschiedene Dinge. Wenn Sie die gleiche Syntax für die beiden von ihnen verwenden, ich glaube, Sie Code Unbekannter sein wird. Und natürlich verlieren Sie die Möglichkeit, sie zu deaktivieren.

Sie können überzeugt sein, dass die Verwendung von Aussagen ist eine gute Sache, weil zwei lesen müssen klassische Bücher wie Der Pragmatische Programmierer von Journeyman und Code Complete dem Meister widmen ganze Abschnitte, um sie und empfehlen deren Verwendung. Es gibt auch eine schönen Artikel mit dem Titel Programmierung mit Behauptungen , die sehr gut veranschaulichen, was über durchsetzungs Programmierung ist, und wenn es zu benutzen (es ist in Java basiert, sondern Konzepte in jede Sprache anwenden).

Was ist Ihr Grund für das Hinzufügen der Assert Methode zum Kernel-Modul? Warum nicht einfach ein weiteres Modul namens Assertions oder etwas verwenden?

Wie folgt aus:

module Assertions
  def assert(param)
    # do something with param
  end

  # define more assertions here
end

Wenn Sie wirklich brauchen Ihre Behauptungen verfügbar sein überall etwas tun, wie folgt aus:

class Object
  include Assertions
end

Disclaimer:. Ich habe nicht den Code testen, aber grundsätzlich würde ich es so machen

Es ist nicht besonders idiomatisches, aber ich denke, es ist eine gute Idee. Vor allem, wenn wie dies geschehen:

def assert(msg=nil)
    if DEBUG
        raise msg || "Assertion failed!" unless yield
    end
end

Auf diese Weise gibt es keine Auswirkung, wenn Sie sich entscheiden, nicht mit DEBUG (oder einem anderen geeigneten Schalter, ich Kernel.do_assert in der Vergangenheit verwendet haben) laufen Satz.

Mein Verständnis ist, dass Sie Ihre eigene Test-Suite als eine Möglichkeit, schreiben besser vertraut mit Ruby-zu werden. So, während Test :: Einheit als Leitfaden nützlich sein könnte, ist es wahrscheinlich nicht das, was Sie suchen (weil es bereits die Arbeit erledigt).

Wie gesagt, Pythons assert ist (für mich zumindest), mehr analog zu C behaupten (3) . Es ist nicht speziell für die Komponententests, eher Fälle zu fangen, wo „dies nie passieren sollte“.

Wie Rubys Einbau-Unit-Tests neigen dazu, das Problem zu betrachten, dann ist, dass jede einzelne Testfall-Klasse ist eine Unterklasse von Testcase , und das schließt ein "" Erklärung geltend machen, was die Gültigkeit überprüft, was ihm übergeben wurde und zeichnet sie für die Berichterstattung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top