2012-03-14 45 views
2

試圖爲我已經編寫的代碼編寫一些測試,以期使用測試驅動開發來擴展我的代碼。Rspec - 訪問巫術方法/變量

我有一個控制器,其索引操作調用一個'user_info'方法,該方法僅依靠Sorcery的current_user變量收集一些實例變量。例如:

def user_info 
    @current_A = current_user.a 
    @current_B = current_user.b 
end 

def index 
    user_info 
    // rest of the method goes here 
end 

我開始使用rspec編寫一些測試,只是爲了感受測試這個代碼庫。我的控制器規範是非常基本的,看起來像這樣:

describe MyController do 
    describe "GET 'index'" do 
    get 'index' 
    response.should be_success 
    end 
end 

不過,我得到以下錯誤,當我嘗試運行此規格: NoMethodError:未定義的方法「一個」假:FalseClass

第一所有,我怎麼讓我的規格識別Sorcery方法current_user?出於好奇,爲什麼current_user被標記爲FalseClass的實例?如果它沒有調用Sorcery方法(並且我沒有在我的代碼中的任何其他地方定義current_user),它應該不顯示爲零嗎?

+0

總是最好接受最好的答案,或者你自己回答,並接受。由於 – 2014-08-12 00:28:29

回答

0

Richard,問題很可能是您沒有current_user。

要做到這一點,您需要模擬登錄過程。

你可以用控制器規格來做到這一點,但我沒有一個很好的例子。我正在編寫有關現有代碼的規範,就像你一樣,而且使用請求規範是有道理的。

我也沒有一個巫術(我應該!!),我在這裏使用水豚填寫表格。不過,這裏是我的規格是什麼樣子:

(這裏:賬戶是一樣的:用戶會)

所以工廠另當別論了,我的這個樣子

context "when logged in" do 

before :each do 
@account = Factory.create(:account) 
@current_game = Factory(:game_stat) 
visit login_path 
    fill_in 'Username or Email Address', :with => @account.email 
    fill_in 'Password', :with => @account.password 
    click_button('Log in') 

末:

Factory.define :account do |f| 
f.sequence(:username) { |n| "ecj#{n}" } 
f.sequence(:email) { |n| "ecj#{n}@edjones.com" } 
f.password "secret" 
f.password_confirmation {|u| u.password } 

您不必使用的工廠,但是你需要得到該會話和current_user建立。

3

要使用巫術測試助手,您需要在spec_helper.rb中的以下行。

以下需求是在Rspec.configure塊:

RSpec.configure do |config| 
    config.include Sorcery::TestHelpers::Rails 
end 

你在的地方之後,你可以使用巫術測試助手。對於Controller測試,您可以將以下內容添加到您的測試中。

@user = either a fixture or a factory to define the user 
login_user 

如果您不想指定@user您可以傳遞參數。

login_user(fixture or factory definition) 

一旦您登錄current_user應該可用於您的測試。

logout_user也可用。

請參閱Sorcery Wiki瞭解有關設置用戶夾具以與login_user幫助程序配合使用的信息。

+0

採取@nmott建議增加法術幫手,這是我的用途控制器規格的最高工作rpsec配置後 - 讓(:用戶){ U = FactoryGirl.create(:用戶)\ n login_user(U)\ n u } – Alex 2014-01-07 06:42:59

0

在重要的一點是要確保,如果你正在使用的創建後,用戶被激活:巫術user_activation子模塊。

所以,如果你使用的製造寶石,那會是什麼樣子,

Fabricator(:properly_activated_user, :from => :user) do 
    after_create { |user| user.activate! } 
end 
0

正如@nmott提到你需要做兩件事情:使用

1)註冊文本輔助方法:

RSpec.configure do |config| 
    config.include Sorcery::TestHelpers::Rails 
end 

2)在你的榜樣訪問current_user通過controller.current_user這樣的:

login_user(user) 
expect(controller.current_user).to be_present