2012-03-14 17 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を定義していません)、それはnilとして表示されませんか?

+0

常に最善の答えを受け入れるか、自分で答えてそれを受け入れるのが最善です。おかげで –

答えて

0

リチャード、問題はあなたが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

Sorceryテストヘルパーを使用するには、spec_helper.rbに次の行が必要です。

次はRspec.configureブロックにする必要があります:

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

あなたの場所でこれを持っていた後、あなたがソーサリー・テスト・ヘルパーを使用することができます。コントローラテストでは、テストに次のものを追加します。

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

@userを指定しない場合は、引数を渡すことができます。

login_user(fixture or factory definition) 

current_userにログインしたら、テストに利用できるはずです。

logout_userも利用できます。

login_userヘルパーで動作するようにユーザーフィクスチャを設定する方法については、Sorcery Wikiを参照してください。

+0

@ nmottのアドバイスを取った後、rpsecの設定でSorceryヘルパーを追加しました。これは私のUsesコントローラspec-let(:ユーザー){ u = FactoryGirl.create(:ユーザー)\ n login_user(u) u } – Alex

0

Sorceryの:user_activationサブモジュールを使用している場合、作成後にユーザーが確実にアクティブになるようにすることが重要です。だから、

、あなたが製作宝石を使用している場合@nmottあなたは二つのことを行う必要がある述べたように、それは

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

、次のようになります。

1)を使用して、テキストヘルパーメソッドを登録します。

:そのような controller.current_userを通して、あなたの例のアクセス current_user

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

2)

login_user(user) 
expect(controller.current_user).to be_present 
関連する問題