【问题标题】:How do I simulate a session variable in minitest?如何在 minitest 中模拟会话变量?
【发布时间】:2018-01-23 02:54:57
【问题描述】:

我正在使用 Rails 5 和 minitest。我想测试一个需要登录的控制器方法,由控制器中的过滤器验证

  before_filter :require_current_user

    def current_user
    @current_user ||= User.find_by(id: session[:user_id])
  end

  def require_current_user
    redirect_to(:root, :notice => "you must be logged in") unless current_user
  end

为了模拟会话变量,我在测试中添加了这个

  def setup
    @logged_in_user = users(:one)
    session[:user_id] = @logged_in_user.id
  end

test "do create" do
  person = people(:one)
  rating
  post rate_url, params: {person_id: person.id, rating: rating}

  # Verify we got the proper response
  assert_response :success
end

但是当我运行上述测试时,它会导致错误

NoMethodError: undefined method `session' for nil:NilClass
    test/controllers/rates_controller_test.rb:10:in `setup'

如何在 minitest 中模拟会话变量?

编辑:根据给出的响应,这是我的 session_create 方法

  def create
    puts "env: #{env["omniauth.auth"]}"
    user = User.from_omniauth(env["omniauth.auth"])
    first_login = user.last_login.nil?
    # Record the fact that this is their first login in the session
    session[:first_login] = first_login
    # Record the last login of the user
    user.last_login = Time.now
    user.save
    session[:user_id] = user.id

    last_page_visited = session[:last_page_visited]
    session.delete(:last_page_visited)
    url = last_page_visited.present? ? last_page_visited : url_for(:controller => 'votes', :action => 'index')
    redirect_to url
  end

【问题讨论】:

  • 请将您的测试用例也粘贴到这里
  • “setup”方法中的代码是测试失败的原因。尽管我想为每个测试模拟会话,但我添加了测试本身,这就是为什么我想将代码放在 setup 方法中而不是每个单独的测试中。

标签: unit-testing session controller ruby-on-rails-5 minitest


【解决方案1】:

我认为这对你有用。

controller.session[:user_id] = users(:one).id

看看here
您还可以为每个测试发布到您的登录页面并设置会话

post login_url, params: { params_necessory_for_login )

结帐this

【讨论】:

  • 我将 "session[:user_id] = @logged_in_user.id" 更改为 "controller.session[:user_id] = @logged_in_user.id" 但仍然收到错误 "NoMethodError: undefined method `session'对于零:NilClass”。 “会话”并不特定于我的控制器。这似乎是一些全局 Rails 应用程序变量 b/c 我从来没有在我的应用程序的任何地方声明它。
【解决方案2】:

在 Rails 4.2 中,ActionController::TestCase 有效:

@controller.session[:user_id] = users(:one).id

也许 Rails 5 也可以。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 2018-10-01
    相关资源
    最近更新 更多