RSpec:如何存留继承方法current_user(w / o Devise)?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (23)

由于UsersController#Edit视图调用current_user.admin?和控制器呼叫,RSpec出现问题@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

据我所知:

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

这使我回到我的.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
用户回答回答于

对我而言我用了这样的方法,你可以参考下:

before { controller.stub!(:current_user).and_return(user) }

所属标签

可能回答问题的人

  • 天使的炫翼

    17 粉丝531 提问9 回答
  • 优惠活动秘书

    0 粉丝2 提问8 回答
  • _逗你玩_

    腾讯 · 客户端安全 (已认证)

    4 粉丝4 提问5 回答
  • uncle_light

    5 粉丝518 提问5 回答

扫码关注云+社区

领取腾讯云代金券