2

我的规格文件:

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]}"

我想我正在插入散列变量,但现在不正确。

4

2 回答 2

4

你不能在一个it块中使用实例变量而不在before. 包裹@state_data在你的before(:each)块中,它应该可以工作。

它如下所示:

before do
  @state_data = {
    :state_slug => 'Alabama', 
    :state_name => 'California'
  }
  visit state_path(:state=>"#{@state_data[:state_slug]}"
end

我的理解是使用实例变量被认为是一种反模式,你应该考虑使用let()orsubject()代替

使用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
于 2013-10-12T12:22:55.767 回答
1

块中定义的局部变量或实例变量describe在任何包含的块中都不可访问it

如果要使任意变量或方法跨多个it块可用,则需要使用let,let!before. 这些let方法可以让您记住辅助方法,而该方法可以让您在执行块before之前执行任意 Ruby 代码。itsubject方法也可用作定义subject助手的方法。

当然,您也可以在每个it块中定义方法或变量。

于 2013-10-13T19:39:28.117 回答