我有一个基于MHartl的RoR4 Tutorial的控制器
就像MHartl一样,我没有使用Devise,而是I rolled my own authentication system
UsersController#Edit
的RSpec有问题,因为视图调用了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)>'
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
但是nil
,current_user
还是会回来的
如有任何帮助/指导,我们不胜感激。谢谢!
将include SessionsHelper
添加到我的user_pages_edit.rb
的顶部describe块中似乎是在尝试使用来自该帮助器的sign_in(路径)。创建issue between RSpec and cookies.permanent
。所以这就是突破口。
unfortunately,这让我回到了我的.admin?
错误。
有两个对current_user.admin?
的调用
One在控制器中:
def path_switch
if current_user.admin? #error current_user == nil
users_path
else
root_path
end
end
One在视图中显示为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
。
发布于 2016-04-29 21:57:11
同样有效
user = create(:user) #FactoryBot
allow(controller).to receive(:current_user).and_return(user)
发布于 2014-07-02 11:57:51
如果你正在做控制器的单元测试,你可以简单地将你的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
这将避免生成多个特征环境会话,也避免多次登录
发布于 2015-06-12 04:09:48
对我来说,我的工作是:
before { controller.stub!(:current_user).and_return(user) }
https://stackoverflow.com/questions/24522294
复制相似问题