コントローラー テストでモデルの特定の属性をスタブ化するのが非常に難しいと感じています。スタブをできるだけ少なくしたいのです。
編集:私は、そのような統合にスタブを使用することをやめました。スタブがアクション コールに到達しないことがわかりました。正しい質問は次のようになります。
モックとスタブを使用して、Rails コントローラー テストで特定の状態をシミュレートするにはどうすればよいですか?
だから私は次のようなものに達しました:
仕様
require 'spec_helper'
describe TeamsController do
let(:team) { FactoryGirl.create :team }
context "having questions" do
let(:competition) { FactoryGirl.create :competition }
it "allows a team to enter a competition" do
post(:enter_competition, id: team.id, competition_id: competition.id)
assigns(:enroll).team.should == team
assigns(:enroll).competition.should == competition
end
end
# ...
end
工場
FactoryGirl.define do
factory :team do
name "Ruby team"
end
factory :competition, class: Competition do
name "Competition with questions"
after_create do |competition|
competition.
stub(:questions).
and_return([
"something"
])
end
end
factory :empty_competition, class: Competition do
name "Competition without questions"
questions []
after_create do |competition|
competition.stub(:questions).and_return []
end
end
end
生産コード
class TeamsController < ApplicationController
def enter_competition
@team = Team.find params[:id]
@competition = Competition.find params[:competition_id]
@enroll = @team.enter_competition @competition
render :nothing => true
end
end
class Team < ActiveRecord::Base
def enter_competition competition
raise Competition::Closed if competition.questions.empty?
enroll = Enroll.new team: self, competition: competition
enroll.save
enroll
end
end
テストを実行すると、questions
属性が存在するnil
ため、モデルでのチェック時にテストが失敗しますnil.empty?
。
そのメッセージの状態が正しく使用されるように、スタブが使用されないのはなぜですか? 私@competition.questions
はそうなると思っ[ "question" ]
ていましたが、代わりにnil
.