2

私は padrino と rspec を使用しており、私が作成したヘルパー メソッドをテストできるようにしたいと考えています。

私は持っている

仕様/アプリ/コントローラー/sessions_controller_spec.rb

    describe "POST /sessions" do
    it "should populate current_user after posting correct user/pass" do

      u = User.create({:email=>"john@gmail.com", :password=>"helloworld", :password_confirmation=>"helloworld"})

      user = { 
        email:"john@gmail.com",
        password:"hellowolrd"
      }   
      post '/sessions/new', user
      current_user.should_not == "null"
    end 
  end 

アプリ/コントローラー/sessions_controller.rb

  post "/new" do
    user = User.authenticate(params[:email], params[:password])
    if user
      session[:user_id] = user.id
      redirect '/' 
    else
      render "sessions/new"
    end 
  end 

アプリ/ヘルパー/sessions_helper.rb

Testing.helpers do
  def current_user
    @current_user ||= User.find(:id=>session[:user_id]) if session[:user_id]
  end 
end

したがって、これは実際には 2 つの部分からなる質問です。最初の部分は、私のメソッド current_user が見つからないことです。第二に、それが見つかった場合、セッションが定義されていないというエラーがスローされる可能性があると思います。しかし、まず最初に、undefined_method current_user を取得するのはなぜですか?

Failures:

  1) SessionsController POST /users should populate current_user after posting correct user/pass
     Failure/Error: current_user.should_not == "null"
     NameError:
       undefined local variable or method `current_user' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_2:0x0000000313c0d8>
     # ./spec/app/controllers/sessions_controller_spec.rb:20:in `block (3 levels) in <top (required)>'
4

1 に答える 1

4

これは彼らの問題トラッカーで答えられました: https://github.com/padrino/padrino-framework/issues/930#issuecomment-8448579

そこから切り取って貼り付けます。

ショートハンド ヘルパー (ちなみにこれは Sinatra であり、Padrino の機能ではありません) は、次の理由からテストが困難です。

MyApp.helpers do
  def foo

  end
end

は次の省略形です。

helpers = Module.new do
  def foo
  end
end

MyApp.helpers helpers

したがって、テスト容易性の問題は明らかです。ヘルパーは匿名モジュールであり、匿名のものを参照するのは困難です。解決策は簡単です: モジュールを明示的にします:

module MyHelpers
  def foo
  end
end

MyApp.helpers MyHelpers

次に、必要な方法でテストします。たとえば、次のようになります。

describe MyHelpers do
  subject do
    Class.new { include MyHelpers } 
  end

  it "should foo" do
    subject.new.foo.should == nil
  end
end

また、ヘルパーはグローバルであると想定しているため、この例は機能しません。それらはアプリケーションによってスコープされます。

于 2012-09-11T17:50:59.213 に答える