gpt4 book ai didi

ruby-on-rails - RSpec:如何 stub 继承的方法 current_user(没有设计)?

转载 作者:行者123 更新时间:2023-12-03 10:55:18 24 4
gpt4 key购买 nike

我有一个基于 MHartl 的 RoR4 Tutorial 的 Controller

就像 MHartl,我没有使用设计 , 我 rolled my own authentication system
UsersController#Edit 的 RSpec 遇到问题因为 View 调用了 current_user.admin? Controller 调用 @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)>'

用户 Controller :
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这让我希望我走在正确的 rails 上,但我无法让它发挥作用。

据我所知(更新):

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还在回来 nil
任何帮助/指导表示赞赏。谢谢!

添加 include SessionsHelper到我的 user_pages_edit.rb 的顶部描述 block 似乎尝试使用该助手的 sign_in(path) 。创建 issue between RSpec and cookies.permanent .所以这是一个半身像。

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

有两个调用 current_user.admin?
一个在 Controller 中:
  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并将其传递给 Controller ​​(然后希望是 View ),以便页面可以加载。
为此,我需要做的就是设置 current_user = user因为 user.admin == true .

最佳答案

如果你在做 单元测试你的 Controller 你可以简单地 stub 你的current_user在之前的 block 中,像这样:

let(:user) { ... }

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

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

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

在这里,您似乎在进行功能测试,您应该编写一个帮助程序来执行用户记录的创建并通过登录。

此外,在功能测试中,为了在运行测试时获得大量时间,请不要犹豫将您的断言分组在同一个 block 中。显然,而不是:
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

这将避免生成您的功能环境的多个 session ,并且还可以多次登录

关于ruby-on-rails - RSpec:如何 stub 继承的方法 current_user(没有设计)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24522294/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com