RSpec:如何存根继承的方法 current_user (无需设计)?

2023-12-30

我有一个基于 MHartl 的控制器RoR4 教程 http://www.railstutorial.org/book/_single-page

就像 MHartl 一样,我没有使用设计, I 推出了我自己的身份验证系统 http://www.railstutorial.org/book/_single-page#sidebar-roll_your_own

RSpec 遇到问题UsersController#Edit因为视图有一个调用current_user.admin?控制器调用@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)>'

用户控制器:

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

我找到了这个非常有帮助的文章 http://leeourand.com/2014/02/09/stub-that-object/这让我希望自己走在正确的轨道上,但我无法让它发挥作用。

据我所知(更新):

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

But current_user还在回来nil

任何帮助/指导表示赞赏。谢谢!


Adding include SessionsHelper到顶部描述我的块user_pages_edit.rb似乎尝试使用该助手的sign_in(path)。创建一个RSpec 和之间的问题cookies.permanent https://stackoverflow.com/questions/21503397/undefined-method-permanent-when-attempting-to-create-a-cookie。所以这就是半身像。

很遗憾,这让我回到了我的.admin? error.

有两个电话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在 before 块中,如下所示:

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

这将避免生成功能环境的多个会话,也避免多次登录

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RSpec:如何存根继承的方法 current_user (无需设计)? 的相关文章

随机推荐