2

私は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の両方に慣れていないので、誰かが提供してくれる助けに本当に感謝しています!

4

2 に答える 2

1

:idで割り当てることはできませんnew。これを試して:

 def create
   @league = League.new(params[:league])
   @league.id = params[:league][:id] if params[:league][:id]
   @user = @league.users.build(params[:user])
   @league_id = @league.id
   @user.update_attribute('league_id', @league_id)
   ... .save conditions appended ...
 end

そうは言っても、どうしてブラウザで動作するのだろうか。

また、テスト時にFactoryGirlまたはFixturesを使用してモデルにデータを割り当てることをお勧めします。

于 2012-06-25T23:48:51.133 に答える
0

こじ開けてみましたか?

このようなことを発見するたびに、変数とその動作を検査できるように、Pry (または Ruby-Debug) を介してブレーキポイントを挿入できると非常に便利だと思います。

binding.pry私は間@league_id = @league.idに入れているのではないかと疑っており@user.update_attribute('league_id', @league_id)、問題に光を当てる可能性が非常に高い.

また、呼び出しで @league_id を永続化すると、ユーザーは @league_id を自動的に継承することに注意してください@league.save。(これが背後にある考え方@league.users.build(..)です - 永続化の際に必要な関係を正しく設定します。

于 2012-06-25T23:22:59.610 に答える