Erster Zugang zu Behauptung Methoden von einem Verfahren Shoulda Should
-
19-09-2019 - |
Frage
Ich habe einen shoulda Makro / Methode, dass Tests Controller Antworten für XPath Bedingungen wie folgt:
def self.should_have_xpath(path, &block)
should "have an element matching the path: #{path}" do
xml = REXML::Document.new @response.body
match = XPath.match(xml, path)
if block_given?
yield match
else
assert match.size != 0, "No nodes matching '#{path}'"
end
end
end
Das XPath-Matching und Einbau-Behauptung funktioniert super. Allerdings habe ich ein Testfall, wo ich will genau ein Spiel-Element bestehen. Dies ist die Aufgabe des optionalen Blockes. XPath Übereinstimmung mit dem Anrufer zu, so dass sie zusätzliche / kontextspezifische Aussagen durchführen können
Leider, wenn ich gehe eigentlich einen Block:
should_have_xpath("//my/xpath/expression") { |match| assert_equal 1, match.size }
... ich diesen Fehler:
NoMethodError: nicht definierte Methode `assert_equal‘ für Benutzer :: SessionsControllerTest: Klasse
Dies ist (wie ich es verstehe) wegen der Art und Weise Shoulda funktioniert: die übergebenen Parameter an den „soll“ Aufruf (einschließlich dem Block) werden im Rahmen der Testklasse definiert und nicht die Instanz der Testklasse. Test :: Unit :: Assertions.assert * sind Modulinstanz Methoden, so dass ich sie nicht bequem zugreifen kann.
Also, meine Frage ist: Gibt es eine bequeme / idiomatische Weg, um die assert * Methoden-Test :: Unit :: Assertions zuzugreifen, ohne zu viel Mühe? Die Lösung muss die Arbeit mit Shoulda, obwohl es muss nicht unbedingt sein muß abhängig auf Shoulda; ein gerade Ruby-Weg wäre in Ordnung.
Lösung
Das sollte funktionieren, wie Sie wollen es an:
def self.should_have_xpath(path, &block)
should "have an element matching the path: #{path}" do
# ...
block.bind(self).call(match)
end
end
Andere Tipps
Ich habe eine Arbeitslösung erhielt:
def self.should_have_xpath(path, &block)
should "have an element matching the path: #{path}" do
# ...
yield match, self
end
end
should_have_xpath( "//my/xpath/expression" ) { |match, test | test.assert_equal 1, match.size }
ich nicht besonders gerne zu haben (denken Sie daran,), um die Testinstanz jedes Mal passieren, weshalb ich hoffe, Stack-Überlauf Lage sein wird, mit einer besseren Antwort zu kommen.