我正在运行Rails 3.1.1,RSpec 2.7.0和HAML 3.1.3.
说我有以下视图文件:
应用程序/视图/布局/ application.html.haml!!! %html %head %title Test = stylesheet_link_tag "application" = javascript_include_tag "application" = csrf_meta_tags %body = content_for?(:content) ? yield(:content) : yield应用程序/视图/布局/ companies.html.haml
- content_for :content do #main = yield :main #sidebar = yield :sidebar = render :template => 'layouts/application'应用程序/视图/公司/ index.html.haml
- content_for :main do %h1 MainHeader - content_for :sidebar do %h1 SidebarHeader
以下spec文件:
规格/视图/公司/ index_spec.rbrequire 'spec_helper' describe 'companies/index.html.haml' do it 'should show the headers' do render rendered.should contain('MainHeader') rendered.should contain('SidebarHeader') end end
当我运行RSpec时,我收到以下错误:
1) companies/index.html.haml should show the headers Failure/Error: rendered.should contain('MainHeader') expected the following element's content to include "MainHeader": # ./spec/views/companies/index_spec.rb:7:in `block (2 levels) in'
起初,我认为RSpec在渲染视图文件时会以某种方式遗漏content_for块.但是,我无法在RSpec的github存储库中找到任何与之相关的问题,所以我不确定在这里应该责怪谁.
我找到的一个(最近)解决方案是http://www.dixis.com/?p=571.但是,当我尝试建议的代码
view.instance_variable_get(:@_content_for)
它返回零.
有没有办法在视图规范中测试content_for?
有没有更好的方法来构建我的布局文件,这样我实际上能够测试它们并仍然实现相同的最终结果?
Benissimo.. 27
使用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()如何填充渲染和view.content_for."rendered"包含视图直接生成的任何输出."view.content_for()"通过content_for()查找视图委托的任何内容.
使用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()如何填充渲染和view.content_for."rendered"包含视图直接生成的任何输出."view.content_for()"通过content_for()查找视图委托的任何内容.