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.

War es hilfreich?

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.

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