Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 无法登录RSpec功能测试_Ruby On Rails_Ruby On Rails 3_Rspec_Capybara - Fatal编程技术网

Ruby on rails 无法登录RSpec功能测试

Ruby on rails 无法登录RSpec功能测试,ruby-on-rails,ruby-on-rails-3,rspec,capybara,Ruby On Rails,Ruby On Rails 3,Rspec,Capybara,当我在测试中直接调用put/delete/post等时,我很难通过RSpec测试。我相信这是由于会话没有在对put/delete等请求的直接调用中传递,但我不能100%确定 进一步信息:这来自rails教程,我实现了使用会话的练习,而不是第8章()中的cookie 此测试通过(因此我非常确定会话在浏览器中正常工作): 这一个没有(在{delete user_path(user)}之前的行失败): 错误是: Authentication authorization as non-admin use

当我在测试中直接调用put/delete/post等时,我很难通过RSpec测试。我相信这是由于会话没有在对put/delete等请求的直接调用中传递,但我不能100%确定

进一步信息:这来自rails教程,我实现了使用会话的练习,而不是第8章()中的cookie

此测试通过(因此我非常确定会话在浏览器中正常工作):

这一个没有(在{delete user_path(user)}之前的行失败):

错误是:

Authentication authorization as non-admin user submitting a DELETE request to the Users#destroy action 
Failure/Error: before { delete user_path(user) }
NoMethodError:
  undefined method `admin?' for nil:NilClass
   - ./app/controllers/users_controller.rb:55:in `admin_user'
   - ./spec/requests/authentication_pages_spec.rb:133:in `block (5 levels) in <top (required)>'
身份验证授权作为非管理员用户向用户提交删除请求#销毁操作
失败/错误:{删除用户\路径(用户)}之前
命名错误:
nil:NilClass的未定义方法“admin”
-/app/controllers/users\u controller.rb:55:in'admin\u user'
-./spec/requests/authentication\u pages\u spec.rb:133:in'block(5级)in'
用户控制器和会话助手的相关位:

class UsersController < ApplicationController
before_filter :admin_user,     only: :destroy

def destroy
  User.find(params[:id]).destroy
  flash[:success] = "User destroyed."
  redirect_to users_path
end

private

  def admin_user
    redirect_to(root_path) unless current_user.admin?
  end

end

module SessionsHelper
  def sign_in(user)
    #cookies.permanent[:remember_token] = user.remember_token
    session[:user_id] = user.id
    self.current_user= user
  end
  def sign_out
    #cookies.delete(:remember_token)
    session[:user_id] = nil
    self.current_user= nil
  end

  def signed_in?
    !current_user.nil?
    #!session[:user_id].nil?
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end
  def current_user?(user)
    user == current_user
  end

  def redirect_back_or(default)
    redirect_to(session[:return_to] || default)
    clear_return_to
  end

  def store_location
    session[:return_to] = request.fullpath
  end
  def clear_return_to
    session.delete(:return_to)
  end

end
class UsersController
您确定可以为这样的请求规范设置会话变量吗?我定义了一个函数,它导航到登录名,填写表单并单击登录按钮。我把它称为在需要登录用户的规范之前。不过,我对要求规格是比较新的,所以可能还有其他方法。

不,我一点也不确定。仍在学习RoR/RSpec,因此正在寻找有关如何实现此功能的指导。显然,您的
登录
呼叫不起作用,因此您的
当前用户
仍然为零。在{sign_in non_admin;put current_user.inspect}之前尝试
,看看会发生什么。
Authentication authorization as non-admin user submitting a DELETE request to the Users#destroy action 
Failure/Error: before { delete user_path(user) }
NoMethodError:
  undefined method `admin?' for nil:NilClass
   - ./app/controllers/users_controller.rb:55:in `admin_user'
   - ./spec/requests/authentication_pages_spec.rb:133:in `block (5 levels) in <top (required)>'
class UsersController < ApplicationController
before_filter :admin_user,     only: :destroy

def destroy
  User.find(params[:id]).destroy
  flash[:success] = "User destroyed."
  redirect_to users_path
end

private

  def admin_user
    redirect_to(root_path) unless current_user.admin?
  end

end

module SessionsHelper
  def sign_in(user)
    #cookies.permanent[:remember_token] = user.remember_token
    session[:user_id] = user.id
    self.current_user= user
  end
  def sign_out
    #cookies.delete(:remember_token)
    session[:user_id] = nil
    self.current_user= nil
  end

  def signed_in?
    !current_user.nil?
    #!session[:user_id].nil?
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end
  def current_user?(user)
    user == current_user
  end

  def redirect_back_or(default)
    redirect_to(session[:return_to] || default)
    clear_return_to
  end

  def store_location
    session[:return_to] = request.fullpath
  end
  def clear_return_to
    session.delete(:return_to)
  end

end