Ruby on rails 如何在rspec capybara测试规范中使用哈希变量
我的规范文件:Ruby on rails 如何在rspec capybara测试规范中使用哈希变量,ruby-on-rails,rspec,capybara,Ruby On Rails,Rspec,Capybara,我的规范文件: require 'spec_helper' describe "State Contracts page" do @state_data = { :state_slug => 'Alabama', :state_name => 'California' } before(:each) { visit state_path(:state=>"#{@state_data[:state_slug]}" )} it 'should ha
require 'spec_helper'
describe "State Contracts page" do
@state_data = {
:state_slug => 'Alabama',
:state_name => 'California'
}
before(:each) { visit state_path(:state=>"#{@state_data[:state_slug]}" )}
it 'should have header' do
page.should have_content("#{@state_data[:state_name]} Contracts")
end
# show statistics specification for State Contract
it "should have #{@state_data[:state_name]} Statistics details" do
page.should have_content("#{@state_data[:state_name]} Statistics")
page.should have_content('Total Obligated Amount')
page.should have_content('Total Transactions')
page.should have_content('Total Contractors')
page.should have_content('Total Contract Recipients')
page.should have_content('Total Offers')
end
end
# show State link
it "should have visible #{@state_data[:state_name]} Links" do
page.should have_content("#{@state_data[:state_name]} Links")
assert_equal(true, find_link("Agencies in #{@state_data[:state_name]}").visible?)
assert_equal(true, find_link("Contractors in "{@state_data[:state_name]}").visible?)
assert_equal(true, find_link("Contracts in #{@state_data[:state_name]}").visible?)
end
end
运行测试后,出现下一个错误:
undefined method `[]' for nil class for "#{@state_data[:state_name]}"
我想我正在插值散列变量,但现在没有正确的方法。在
it
块中使用实例变量时,必须在之前的中声明它。在(:each)
块之前将@state\u数据
包装在中,它应该可以工作
它将如下所示:
before do
@state_data = {
:state_slug => 'Alabama',
:state_name => 'California'
}
visit state_path(:state=>"#{@state_data[:state_slug]}"
end
我的理解是,使用实例变量被认为是反模式,应该考虑使用<代码>()< <代码> > <代码>主题()>代码>代替
使用let()
会将此更改为:
let(:state_data) do
{
:state_slug => 'Alabama',
:state_name => 'California'
}
end
before { visit state_path(:state=>"#{state_data[:state_slug]}" }
it 'should have header' do
page.should have_content("#{state_data[:state_name]} Contracts")
end
descripe
块中定义的局部变量或实例变量在任何包含的it
块中都是不可访问的
如果要使任意变量或方法在多个it
块中可用,则需要使用let
,let在
之前编码>或。let
方法允许您记忆helper方法,而before
方法允许您在执行it
块之前执行任意Ruby代码。subject
方法也可用作定义subject
助手的方法
当然,您也可以在每个it
块中定义方法或变量