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()orを使用することを検討する必要がありますsubject()

を使用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ブロックで使用可能にしたい場合はletlet!またはを使用する必要がありますbeforeletメソッドを使用すると、ヘルパー メソッドをメモ化でき、メソッドを使用すると、ブロックbeforeを実行する前に任意の Ruby コードを実行できます。itこのメソッドは、ヘルパーsubjectを定義する手段としても利用できます。subject

もちろん、各itブロック内でメソッドや変数を定義することもできます。

于 2013-10-13T19:39:28.117 に答える