私のアプリケーションは正常に動作しますが、テストに合格できません。私はレールに慣れていないので、答えが明らかな場合は許してください。
すべてのビューで使用できる変数が必要なので、これを次の範囲内で実行していますapplication_controller.rb
。
class ApplicationController < ActionController::Base
protect_from_forgery
before_filter :course
def course
@course = Course.find_slug(params[:course])
end
end
私のテストケースは次のようになります。
it "creates an attempt" do
sign_in current_user
params = {:id => challenge.id, :description => "this was hard!", :course => "design"}
@course = FactoryGirl.create(:course)
post :completed, params
response.should redirect_to "/#{@course.slug}/?challenge_slug=" + challenge.slug
Attempt.count.should == 1
Attempt.last.description.should == params[:description]
end
私のコントローラー内のメソッドは次のようになります。
def completed
@challenge = Challenge.find(params[:id])
@challenge.completed(current_user, params)
redirect_to "/#{@course.slug}/?challenge_slug=" + @challenge.slug.to_s
end
アプリケーションを使用している場合、これはすべて正常に機能しますが、テストでは次のようになっています。
1) ChallengesController completing a challenge creates an attempt
Failure/Error: post :completed, params
NoMethodError:
undefined method `slug' for nil:NilClass
# ./app/controllers/challenges_controller.rb:16:in `completed'
# ./spec/controllers/challenges_controller_spec.rb:36:in `block (3 levels) in <top (required)>'
コントローラをハードコーディングしてredirect_to "#{'expected_value'}"
テストに合格した場合、テスト環境内ではアプリケーション変数にアクセスできないようです@course
が、これは正しいですか?
私はこれを解決する方法に迷っています。どんな助けでも大歓迎です。