Используя Rspec 2 с Rails 3, чтобы написать спецификации представления для использования content_for, сделайте следующее:
view.content_for(:main).should contain('MainHeader')
# instead of contain() I'd recommend using have_tag (webrat)
# or have_selector (capybara)
ps значение блока content_for (...) по умолчанию является пустымстрока, поэтому если вы хотите написать спецификации, показывающие случаи, когда content_for (: main) не вызывается, используйте:
view.content_for(:main).should be_blank
Ваша спецификация может быть записана как:
it "should show the headers" do
render
view.content_for(:main).should contain('MainHeader')
view.content_for(:side_header).should contain('SidebarHeader')
end
Таким образом, ваша спецификация показывает, что именно делает ваш вид, независимо от макета.Для спецификации просмотра, я думаю, что это уместно проверить его изолированно.Всегда ли полезно писать спецификации вида?Это открытый вопрос.
Вместо этого, если вы хотите написать спецификации, показывающие, как выглядит разметка, предоставляемая пользователю, вам понадобится либо спецификация запроса, либо функция огурца.Третий вариант - это спецификация контроллера, которая включает в себя представления.
ps, если вам нужно было специфицировать представление, которое выводит некоторую разметку напрямую и делегирует другую разметку для content_for (), вы можете сделать это следующим образом:
it "should output 'foo' directly, not as a content_for(:other) block" do
render
rendered.should contain('foo')
view.content_for(:other).should_not contain('foo')
end
it "should pass 'bar' to content_for(:other), and not output 'bar' directly" do
render
rendered.should_not contain('bar')
view.content_for(:other).should contain('bar')
end
Это, вероятно, было бы излишним, но я просто хотел показать, как render () заполняет render и view.content_for.«Rendered» содержит любой вывод, производимый представлением напрямую."view.content_for ()" ищет любой контент, который представление делегировало с помощью content_for ().