ruby-on-rails – RSpec:如何存根继承方法current_user(w / o D
|
我有一个基于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 不幸的是,这让我回到我的.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,如下所示:
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
这将避免生成几个会话的功能环境,并且还要登录几次 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
