【发布时间】: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