rspec控制器测试与设计认证

时间:2011-09-17 03:40:44

标签: testing authentication rspec controller

我遇到了rspec测试控制器设计验证的问题。

我有以下设置

我已经包含了

config.include Devise::TestHelpers, :type => :controller

在我的spec_helper.rb

在我的merchants_controller_spec.rb

describe MerchantsController do
  before :each do
    @user = Factory(:user)
    @merchant = Factory(:merchant, :user_id => @user.id,:is_approved => false, :is_blacklisted => false)
    controller.stub!(:current_user).and_return(@user)
  end
  describe "GET index" do
    it "assigns all merchants as @merchants" do
      merchant = Factory(:merchant,:is_approved => true, :is_blacklisted => false)
      get :index
      assigns(:merchants).should eq([merchant])
    end
  end
end

我的商家_controller.rb

class MerchantsController < ApplicationController

  before_filter :authenticate_user!
  def index
    @merchants = Merchant.approved
    debugger
    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @merchants }
    end
  end
end

我在商家模型中批准了范围

scope :approved, where(:is_approved => true, :is_blacklisted => false)

现在我的问题是即使我存在current_user并将@user作为current_user返回,我的商家控制器索引规范也失败了。但是,如果我评论出authenticate_user!然后规范通过,

没有authenticate_user!使用authenticate_user捕获索引操作的调试器!调试器没有被捕获。

我认为subing current_user存在问题,我无法弄明白。

帮帮我..

2 个答案:

答案 0 :(得分:23)

您是否已阅读github上的文档?:

  

Devise包含一些功能规格的测试助手。要使用它们,您只需在测试类中加入Devise::TestHelpers并使用sign_insign_out方法。这些方法与控制器具有相同的签名:

sign_in :user, @user   # sign_in(scope, resource)
sign_in @user          # sign_in(resource)

sign_out :user         # sign_out(scope)
sign_out @user         # sign_out(resource)

答案 1 :(得分:4)

另一种选择

RSpec.describe YourController, :type => :controller do
  before do
    user = FactoryGirl.create(:user)
    allow(controller).to receive(:authenticate_user!).and_return(true)
    allow(controller).to receive(:current_user).and_return(user)
  end

  # rest of the code
end