0

私のアプリケーションは正常に動作しますが、テストに合格できません。私はレールに慣れていないので、答えが明らかな場合は許してください。

すべてのビューで使用できる変数が必要なので、これを次の範囲内で実行しています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が、これは正しいですか?

私はこれを解決する方法に迷っています。どんな助けでも大歓迎です。

4

1 に答える 1

1

解決策の 1 つは、find メソッドをスタブ化し、インスタンス変数を返すことです。

before(:each) do
  @course = FactoryGirl.create(:course)
  Course.stub(:find_slug).and_return(@course)
end

これにより、「find_slug」のテストはコントローラーではなくコースモデルにある必要があるため、テストがより堅牢になります。

于 2012-04-26T06:01:19.173 に答える