私はRubyonRailsアプリを、通常のモデル、ビュー、コントローラーの品揃えで構築しています。
私のコントローラーの1つでの「作成」アクションは、2つの異なるモデルのインスタンスを作成することになっています。これが私のコードです:
def create
@league = League.new(params[:league])
@user = @league.users.build(params[:user])
... .save conditions appended ...
end
したがって、/ LeaguesへのPOSTリクエストを介してLeaguesControllerを介して「create」を呼び出すと、Leagueの新しいインスタンスとUserの新しいインスタンスを取得します。また、新しいUserインスタンスが新しいLeagueインスタンスのIDを継承するようにしたいので、インスタンスをリンクするための外部キーとして使用できます。これは次の方法で実現されます。
def create
@league = League.new(params[:league])
@user = @league.users.build(params[:user])
@league_id = @league.id
@user.update_attribute('league_id', @league_id)
... .save conditions appended ...
end
ユーザーモデルはすでにbelongs_to
リーグモデルであり、has_many
ユーザーです。
上記のコードは、手動テストで検証され、問題なく機能します。ただし、Rspecを使用してこれらのテストを自動化する方法を一生理解することはできません。私はいい子になり、テスト駆動開発を使おうとしていますが、これは私を困惑させます。
問題は、テストで新しく作成されたリーグとユーザーのインスタンスの属性にアクセスする方法がわからないことです。私は次のコードを使用してそうしようとしています:
describe LeaguesController do
describe 'new league and user' do
it 'should create a new user with a league_id equal to the new leagues id'
@league_attr = { :name => "myleague", :confirmation_code => "mycode", :id => 5}
@user_attr = { :username => "myname", :password => "mypass"}
post :create, :user => @user_attr, :league => @league_attr
assigns(:league_id).should eql(5)
end
end
end
しかし、テストはnil
の値に対して戻ります:league_id
私はプログラミング全般と特にRspecの両方に慣れていないので、誰かが提供してくれる助けに本当に感謝しています!