0

私は2つのモデルを持っています:UserTopic。ユーザーは多くのトピックを持つことができ、トピックは1人のユーザーに属します。

トピックコントローラーで、有効なトピックの作成アクションをテストしようとしています。

テスト

  # topics_controller.test.rb
  def test_create_valid
    sign_in Factory(:user) # Devise will redirect you to the login page otherwise.
    topic = Factory.build :topic
    post :create, :topic => topic
    assert_redirected_to topic_path(assigns(:topic))
  end

ファクトリー(ファクトリーガール)

# factories.rb
Factory.define :user do |f|
  f.sequence(:username) { |n| "foo#{n}"}
  f.password "password"
  f.password_confirmation { |u| u.password}
  f.sequence(:email) { |n| "foo#{n}@example.com"}
end

Factory.define :topic do |f|
  f.name "test topic"
  f.association :creator, :factory => :user
end

テスト出力

ERROR test_create_valid (0.59s) 
      ActionController::RoutingError: No route matches {:action=>"show", :controller=>"topics", :id=>#<Topic id: nil, name: nil, created_at: nil, updated_at: nil, creator_id: 1>}
      /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.0.7/lib/action_dispatch/routing/route_set.rb:425:in `raise_routing_error'

テストでtopic.valid?は、trueでありtopic.name、工場からの値があります。

しかし、投稿はそれを過ぎていないようですpost :create, :topic => topic。テスト出力にIDがないため、データベースに保存されていないようです。

編集:新しいトピックのためにファクトリをバイパスしても、機能しません。

  def test_create_valid
    @user = Factory :user
    sign_in @user
    topic = @user.topics.build(:name => "Valid name.")
    post :create, :topic => topic
    assert_redirected_to topic_path(assigns(:topic))
  end

同じテストエラーが発生します。

4

2 に答える 2

1

ここでのpostメソッドは、オブジェクトではなく、2番目の引数としてパラメーターを想定しています。これはcreate、コントローラーのアクションがparamsメソッドを使用してこれらのパラメーターを取得し、次のようなコードを使用して新しいトピックを作成するプロセスで使用するためです。

Topic.new(params[:topic])

したがって、既存のオブジェクトではなく、作成するプロジェクトの属性params[:topic]である必要があります。ただし、を使用してインスタンス化されたオブジェクトを取得し、それを機能させるためにこれを行うことができます。TopicFactory.build :topicTopic

post :create, :topic => topic.attributes
于 2011-05-08T02:34:44.427 に答える
0

これは私をはるかに超えていますが、どうやらパラメータで属性を手動で設定する必要がありましたpost :create:topic => topicそのようなRailsのイディオムを考えると、かなり直感に反しているようです。

  def test_create_valid
    sign_in @user
    topic = Factory.build :topic
    post :create, :topic => {:name => topic.name}
    assert_redirected_to topic_path(assigns(:topic))
  end

うまくいけば、誰かがなぜうまくpost :create, :topic => topicいかないのかを明らかにすることができます。

于 2011-05-08T02:25:42.923 に答える