2012-03-13 5 views
5

私はブロックの前の外にカピバラのメソッドを使用する場合は、この奇妙なエラーを取得維持:未定義のローカル変数やメソッドカピバラのRSpecの

$ rspec . -e "PasswordResets" 
/spec/requests/password_resets_spec.rb:9:in `block (2 levels) in <top (required)>': undefined local variable or method `root_path' for #<Class:0x00000003bfa100> (NameError) 

root_pathはありませんが存在します。私は他にもいくつかのテストがあります。しかし、方法がbeforeブロック内にある場合、私はカピバラしか使用できないようです。これは動作します:

require 'spec_helper' 
describe "PasswordResets" do 
    subject { page } 
    describe "it emails user when requesting a password reset" do 
    before do 
     visit root_path 
    end 
    end 
end 

これはエラーを生成します。

require 'spec_helper' 
describe "PasswordResets" do 
    subject { page } 
    describe "it emails user when requesting a password reset" do 
    visit root_path 
    end 
end 

これは動作します:私は何をしたいか

require 'spec_helper' 
describe "PasswordResets" do 
    it "emails user when requesting a password reset" do 
    visit root_path 
    end 
end 

subject { page }を使用しますが、しなくても、カピバラを使用することができるようですbefore do endブロックを使用してください。私が間違っていることは何か考えていますか?

マイspec_helper.rbファイル:私はカピバラ1.1.2、RSpecの2.8.1とRailsの3.2によ

ENV["RAILS_ENV"] ||= 'test' 
require File.expand_path("../../config/environment", __FILE__) 
require 'rspec/rails' 
require 'rspec/autorun' 
require 'capybara/rspec' 

Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f} 

RSpec.configure do |config| 
    config.fixture_path = "#{::Rails.root}/spec/fixtures" 
    config.use_transactional_fixtures = true 
    config.infer_base_class_for_anonymous_controllers = false 
end 

+0

「before(:all)」または「before(:each)」のどちらかを使用する必要はありませんか?私はそれ以前には有効ではなかったと思った。 – jefflunt

答えて

8

describeにテストコードを直接入力することはできません。スコープは異なります。 beforeまたはitブロックに入れてください。

+0

私はRubyとRoRの新機能であることを知っていますが、これがどうして起こるのか、スコープ/ブロック記述の仕組みを少し詳しく説明できるでしょうか?私は怠惰ではない、私はちょうど十分な "ダミーのために"消化できるように何かを発見していない... – Mohamad

+2

モハマド、私は開始するには良い場所としてRSpecの本をお勧めします。基本的な基本は、 "記述する"ブロックの中に入るのは "前"、 "文脈"、 "それ"のブロックだけです –