ArgumentError: сообщение утверждения должно быть строкой или процедурой с использованием assert_select

#ruby-on-rails #ruby #ruby-on-rails-3.1 #testunit

#ruby-on-rails #ruby #ruby-on-rails-3.1 #testunit

Вопрос:

Я пишу тест контроллера для приложения rails 3.1 с использованием testunit 2.4.0.

Я хочу утверждать, что определенный заголовок не отображается на странице.

Я использую assert_select следующим образом:

 assert_select 'h1', {:text => /Key Dates/, :count => 0}
  

и выдает следующую ошибку:

 ArgumentError: assertion message must be String or Proc: <</Key Dates/>
expected but was <"Planner Maternity leave">.>(<Test::Unit::Assertions::AssertionMessage>)
  

Я отследил это до того факта, что assert_select вызовы build_message , которые создают экземпляр AssertionMessage и передают его тестовому модулю assert . Однако в версии 2.2 testunit (февраль 2011) были добавлены проверки, которые проверяют тип переданного сообщения. Эти проверки запускают ArgumentError показанное выше.

Я не уверен, заключается ли ошибка в том, что тестовый модуль является чрезмерно строгим или assert_select передает неправильный тип объекта.

Можете ли вы посоветовать, как лучше всего следовать этому? Какие-либо обходные пути?

Комментарии:

1. Проблема в том, что значение в :text должно быть строкой, а не шаблоном?

2. Привет, нет, вполне приемлемо, чтобы :text был регулярным выражением

Ответ №1:

Итак, документация assert_select показывает следующий пример, передавая блок в:

 assert_select "ol" do |elements|
  elements.each do |element|
    assert_select element, "li", 4
  end
end
  

Так что, если вы сделали что-то вроде…

 assert_select 'h1' do |elements|
  elements.length == 0 ? fail
  elements.each do |element|
    element.text ~= /Key Dates/ ? fail
  end
end
  

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

Ответ №2:

Если вы не можете перейти на версию без ошибок, вы можете просто передать третий аргумент (сообщение), чтобы не создавать принудительное сообщение:

assert_select 'h1', {:text => /Key Dates/, :count => 0}, "Unexpected Key Dates found."