Тестирование помощников представлений: как указать контроллер?

Рассмотрим, например, следующий код:

class ViewHelpersTest < ActionView::TestCase
  should 'generate tag with correct parameters' do
    assert_equal theme_stylesheet_link_tag('style', :media => 'print'),
                 '<link href="/themes/default/stylesheets/style.css" media="print" rel="stylesheet" type="text/css" />'                     
  end
end

current_theme_stylesheet_tag - помощник просмотра, который создает тег ссылки таблицы стилей, указывающий на файл css, расположенный внутри каталога текущей темы. Текущую тему можно получить, вызвав ApplicationController::current_theme.

Итак, мне нужно предоставить действующий экземпляр контроллера, что подводит меня к моему вопросу:

Как именно указать контроллер, который будет использоваться при тестировании помощников представлений в Rails 3?

Кроме того, если есть лучший способ выразить этот тест, пожалуйста, дайте мне знать. У меня мало опыта тестирования.


person Matheus Moreira    schedule 12.01.2011    source источник


Ответы (2)


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

В RSpec это может работать так, если ваш метод current_theme просто возвращает строку:

describe ViewHelper do
  it "should generate tag with correct parameters" do
    ApplicationController = double(:current_theme=>"A string")
    helper.my_helper_method("argument").should == "A string"
  end
end

Когда вспомогательный метод выполняет ApplicationController::current_theme, он использует заглушку вместо фактического метода, поэтому нет необходимости создавать экземпляр контроллера или даже запрашивать код контроллера.

person zetetic    schedule 12.01.2011
comment
Извините, но ИМХО это не имеет особого значения, если вы поклонник помощников по тестированию. Это метод, поэтому его следует протестировать. - person rubiii; 01.03.2011
comment
Не нужно извиняться :) Если вы разрабатываете стиль BDD, и вы уже определили результат работы помощника в спецификациях представления, я не вижу необходимости тестировать помощник отдельно, особенно когда вы выполняете только рефакторинг представления. код. Но я признаю, что спецификации, безусловно, полезны для сложных помощников. - person zetetic; 01.03.2011

Я не эксперт по тестированию, но мне интересно, должен ли это быть тест контроллера вместо теста просмотра. Например, Rails Guides описывает тесты просмотра как «подтверждение наличия ключевых элементов HTML и их содержимого».

Если вы настраиваете тему в контроллере, можете ли вы протестировать ее там?

person TK-421    schedule 12.01.2011
comment
На самом деле я новичок в рабочем процессе тестирования. У меня есть другие помощники, которые генерируют теги, которые мне нужно протестировать, возможно, мне следует отредактировать свой вопрос, чтобы включить эту информацию ... - person Matheus Moreira; 12.01.2011