Получение доступа к методам утверждения из метода musta - PullRequest
1 голос
/ 11 февраля 2010

У меня есть макрос / метод 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-путь будет хорошо.

Ответы [ 2 ]

1 голос
/ 11 февраля 2010

Это должно работать так, как вы хотите:

def self.should_have_xpath(path, &block)
  should "have an element matching the path: #{path}" do
    # ...
    block.bind(self).call(match)
  end
end
0 голосов
/ 11 февраля 2010

У меня есть рабочее решение:

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 }

Мне не особо нравится (не забывать) каждый раз проходить тестовый экземпляр, поэтому я надеюсь, что переполнение стека сможет найти лучший ответ.

...