2009-01-28 13 views
5

Gibt es eine integrierte Möglichkeit zum Angeben von Einträgen in Rails, die eine Ausnahme auslösen, wenn eine Invariante während der Entwicklung und des Testens unterbrochen wird?Bestätigt in Rails von Modellen oder Controllern?

Edit: Nur um klar zu sein, ich suche nach Behauptungen, die in Modellen oder Controllern platziert werden können im Gegensatz zu behauptet, dass Sie für Komponententests verwenden würden.

Antwort

9

Es gibt viele Assert-Funktionen, wenn Sie Tests schreiben. Aber für Assertiona im Hauptcode gibt es keine und Sie können Ihre eigenen leicht rollen.

hinzufügen, so etwas zu environment.rb:

class AssertFailure < Exception 
end 

def assert(message = 'assertion failed') 
    unless block_given? and yield 
    raise message 
    end 
end 

und machen es zu einem No-op in Ihrem environments/production.rb so gibt es minimale Kopf

def assert(message = 'assertion failed') 
end 

Dann in Ihrem Code, können Sie behaupten zu Ihr Herzinhalt:

assert { value == expected_value } 
assert('value was not what was expected') { value == expected_value } 

Wenn value ist nicht gleich expected_value und Sie laufen nicht in der Produktion, eine Ausnahme wird ausgelöst.

+0

Ich bin mir nicht sicher, ob die Assert-Methode eine Methode der AssertFailure-Klasse sein soll oder nicht. Es sieht nicht so aus, wie es sollte, aber wenn ich diesen Code verwende, bekomme ich einen "unerwarteten $ end, expectation keyword_end" -Fehler. Können Sie bitte ausarbeiten und angeben, ob für die Verwendung bitte benötigt/enthalten ist? (Auch - es scheint wie ein Teil der Anwendung Implementierung - so ist das Config-Verzeichnis ein geeigneter Ort für solchen Code?) – DavidJ

+0

Ich denke, es sollte eine "Ende" -Linie unmittelbar nach der 'Klasse' Linie sein. – dubek

+0

Können Sie erklären, was die Klassendeklaration dort macht? Wie kommt es ins Spiel? –

1

Beyond these, meinst du?

+0

Ich glaube, das OP spricht über behauptet im Hauptcode, im Gegensatz zu Test Behauptungen. –

+0

Schwer zu sagen, oder? :) –

+0

ein wenig, ja;) –

Verwandte Themen