就像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.
解决方法
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