微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails – RSpec:如何存根继承方法current_user(w / o Devise)?

我有一个基于MHartl的 RoR4 Tutorial的控制器

就像MHartl,我没有使用Devise,我rolled my own authentication system

由于视图已经调用了current_user.admin,所以使用RSPec for UsersController#编辑有问题?并且控制器调用@path_switch = path_switch

我不断得到RSpec错误

1) User Pages Edit 
 Failure/Error: visit edit_user_path(user)
 NoMethodError:
   undefined method `admin?' for nil:NilClass
 # ./app/controllers/users_controller.rb:106:in `path_switch'
 # ./app/controllers/users_controller.rb:53:in `edit'
 # ./spec/requests/user_pages_spec.rb:54:in `block (3 levels) in <top (required)>'

UsersController:

class UsersController < ApplicationController
  ...
  def edit
    @user = User.find(params[:id])
    @path_switch ||= path_switch                        #error
  end
  ...
  def path_switch
    if current_user.admin?                               #error
      users_path
    else
      root_path
    end
  end
end

我发现这个really helpful article给了我希望我在正确的轨道上,但我不能让它上班.

这就是我所得到的(更新):

user_pages_spec.rb:

require 'spec_helper'
require 'support/utilities'

describe "User Pages" do
  #include SessionsHelper

  let(:user) { FactoryGirl.create(:user) }
  let(:current_user) {user}

  subject { page }

  describe "Edit" do
    before do
      sign_in(user)
      visit edit_user_path(user) 
    end

    it '(check links and content)' do
      should have_button('Submit')
      should have_link('Cancel')
      should have_content(user.fname+"\'s profile")
    end
   ...
  end
...
end

但是current_user仍然回来没有

任何帮助/指导是赞赏.谢谢!

添加包括SessionsHelper到我的user_pages_edit.rb的顶部描述块似乎尝试使用该帮助器的sign_in(路径).创造一个issue between RSpec and cookies.permanent.这是一个破产.

不幸的是,这让我回到我的.admin?错误.

有两个调用current_user.admin?

一个在控制器中:

def path_switch
    if current_user.admin?    #error current_user == nil
      users_path
    else
      root_path
    end
  end

一个人认为是ERB:

<% if current_user.admin? %>
  <div class="row  col-xs-6 col-sm-6 col-md-3">
    <div class="input-group input-selector">
    ...

所有我需要做的是弄清楚如何设置current_user.admin = true并将其传递给控制器​​(然后希望该视图),以便页面可以加载.
要做到这一点,我需要做的就是设置current_user = user,因为user.admin == true.

解决方法

如果您正在对控制器进行单元测试,您可以简单地在之前的块中存放current_user,如下所示:
let(:user) { ... }

# RSpec version <= 2 Syntax:
before { controller.stub(:current_user) { user } }

# RSpec version >= 3 Syntax:
before { allow(controller).to receive(:current_user) { user } }

如果您正在进行功能或请求测试,我建议您通过在数据库中创建用户来执行真正的登录,然后通过此用户凭据传递登录页面

在这里,您似乎正在进行功能测试,您应该写一个执行创建用户记录并访问登录的帮助器.

另外在功能测试中,在运行测试时获得了很多时间,请不要犹豫,将您的断言分组在同一个程序段中.显然,而不是:

it { should have_button('Submit')}
it { should have_link('Cancel')}
it { should have_content(user.fname+"\'s profile")}

你可以写

it 'check links and content' do
  should have_button('Submit')
  should have_link('Cancel')
  should have_content(user.fname+"\'s profile")
end

这将避免生成几个会话的功能环境,并且还要登录几次

原文地址:https://www.jb51.cc/ruby/273499.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐