У меня есть макрос / метод musta, который проверяет ответы контроллера для условий XPath, например:
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
Отличное соответствие XPath и встроенное утверждение. Однако у меня есть один тестовый пример, в котором я хочу, чтобы точно существовал один элемент соответствия. Это работа необязательного блока: предоставить сопоставление XPath вызывающей стороне, чтобы он мог выполнять дополнительные / зависящие от контекста утверждения.
К сожалению, когда я на самом деле передаю блок:
should_have_xpath("//my/xpath/expression") { |match| assert_equal 1, match.size }
... Я получаю эту ошибку:
NoMethodError: неопределенный метод `assert_equal 'для пользователей :: SessionsControllerTest: Class
Это (как я понимаю) из-за того, как работает Должа: параметры, передаваемые в вызов «должен» (включая блок), определяются в контексте класса теста, а не в экземпляре класса теста. Test :: Unit :: Assertions.assert * являются методами экземпляра модуля, поэтому я не могу получить к ним удобный доступ.
Итак, мой вопрос: есть ли удобный / идиоматический способ доступа к методам assert * из Test :: Unit :: Assertions без особых проблем? Решение должно работать с Ifa, хотя оно не обязательно должно зависеть от 1020 *; прямой Ruby-путь будет хорошо.