如何使用rspec的padrino辅助方法(how to use padrino helper me

2019-07-30 05:42发布

我使用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

所以,这的确是一个问题两个部分。 第一部分是我的方法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)>'

Answer 1:

这是回答了他们的问题跟踪: https://github.com/padrino/padrino-framework/issues/930#issuecomment-8448579

剪切和粘贴有:

速记佣工(这是一个西纳特拉,不是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

此外,你的例子不工作,因为它假定助手是全球性的,他们都没有:它们是由应用程序作用域。



文章来源: how to use padrino helper methods in rspec
标签: rspec padrino