2010-09-07 67 views
3

我users_controller.rb如何爲users_controller存根| authlogic,rspec2,Rails3中,factory_girl

# GET /users/1/edit 
def edit 
    @user = current_user 
    #@user = User.find(params[:id]) 
end 

我甜蜜的尋找users_controller_spec.rb(注意我的所有註釋掉的嘗試)

describe "Authenticated examples" do 
    before(:each) do 
    activate_authlogic 
    UserSession.create Factory.build(:valid_user) 
    end 

describe "GET edit" do 
    it "assigns the requested user as @user" do 
    @user = Factory.create(:valid_user) 
    assigns(:user).should be(Factory.build(:valid_user)) 
    end 
end 

user.rb - 工廠

Factory.define :valid_user, :class => User do |u| 
    u.username "Trippy" 
    u.password "password" 
    u.password_confirmation "password" 
    u.email "[email protected]" 
    u.single_access_token "k3cFzLIQnZ4MHRmJvJzg" 
end 

基本上我只是試圖讓這個RSpec測試以最合適的方式通過。

我需要能夠很簡單地說,mock_usercurrent_user

該測試通過,如果我在users_controller.rb使用@user = User.find(params[:id])

謝謝!

回答

3

我m不知道這是否適用於Rspec 2,但根據Authlogic文檔,您需要將其置於before方法,或在spec_helper

include Authlogic::TestCase 
activate_authlogic 

然後你就可以創建,你會以外的測試環境的用戶會話。

FWIW我放棄了Authlogic示例中的模擬/存根,並執行@user = Factory.create(:user),然後用UserSession.create(@user)登錄。

編輯

下面是一個使用你提供的示例的嘗試。我認爲你遇到的問題是assigns中的對象與你所匹配的對象不一樣。

describe "Authenticated examples" do 
    before(:each) do 
    # assuming you put include Authlogic::TestCase in spec_helper 
    activate_authlogic 
    @user = Factory.create(:valid_user) 
    UserSession.create(@user) 
    end 

describe "GET edit" do 
    it "assigns the requested user as @user" do 
    # add a MyModel.stub!(:find) here if the edit action needs it 
    get :id => 1 # pass in an ID so the controller doesn't complain 
    assigns(:user).should == @user 
    end 
end 
+0

我在我的spec_helper中包含'Authlogic :: TestCase'。我之前的(:each)中的activate_authlogic像上面那樣。我**正嘗試使用Factory來製作用戶。從我上面的一個例子來看,它非常接近你的。我現在猜測,我的問題來自語法問題。哈!祝我好運;) – Trip 2010-09-08 13:41:14

+0

我更新了我上面的場景。 ;) – Trip 2010-09-08 14:21:07

+0

看着更新後的代碼,你是否遺漏了'get'?另外,看起來像Factory.build(:valid_user)'的結果在每次調用之後都會有所不同,除非在工廠工作時有某種單例模式。 – zetetic 2010-09-08 15:50:02

1

所有這個頁面上:

http://rdoc.info/github/binarylogic/authlogic/master/Authlogic/TestCase

你需要把一些信息:

require "authlogic/test_case" # include at the top of test_helper.rb 
    setup :activate_authlogiC# run before tests are executed 
    UserSession.create(users(:whomever)) # logs a user in 

天道酬勤這種情況下,你只需要改變你的users(:whomever)mock_user

+0

Right..tried太當塊之前引用它的。沒有交易。 – Trip 2010-09-07 15:46:08

+0

@hingara,上面更新了我的代碼,但我似乎遇到了正確的語法問題。 – Trip 2010-09-08 17:31:46

4

有一個在RSpec的護欄(見https://github.com/rspec/rspec-rails/issues/391)中的錯誤RSpec中的全局鉤子之前使用時,打破activate_authlogic。

而不是

# spec_helper.rb 

# In RSpec.configure 
config.before :each, :type => :controller do 
    activate_authlogic 
    user = User.new(:login => "user", :password => "secret") 
    UserSession.create(user) 
end 

你可以定義一個輔助

# spec_helper.rb 

require 'authlogic/test_case' 
module LoginHelper 
    include Authlogic::TestCase 

    def login_user 
    activate_authlogic 
    user = User.new(:login => "user", :password => "secret") 
    UserSession.create(user) 
    end 
end 

,需要

# <controller>_spec.rb 

describe "GET 'edit' when logged in" do 
    before do 
    login_user 
    end 

    it "should be successful" do 
    get 'edit' 
    response.should be_success 
end 
+0

作爲一種替代方案,你可以定義一個共享的上下文。 – trkoch 2011-06-05 16:25:07

+1

很好的答案。但是你需要在測試開始時加入'include LoginHelper'。 – phatmann 2011-10-28 14:20:25

相關問題