как использовать вспомогательные методы padrino в rspec

Я использую 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=>"[email protected]", :password=>"helloworld", :password_confirmation=>"helloworld"})

      user = { 
        email:"[email protected]",
        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

Так что это действительно вопрос из двух частей. Во-первых, мой метод 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)>'

person jdkealy    schedule 02.07.2012    source источник


Ответы (1)


На это ответили в их системе отслеживания проблем: 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

Кроме того, ваш пример не работает, потому что он предполагает, что помощники являются глобальными, а это не так: они ограничены приложением.

person icco    schedule 11.09.2012