Почему этот Test :: Unit test не может сохранить модель в `post: create`? - PullRequest
0 голосов
/ 08 мая 2011

У меня есть две модели: User и Topic.У пользователей может быть много тем, и темы принадлежат одному пользователю.

В моем контроллере тем я пытаюсь проверить действие создания для действительной темы:

Тест

  # 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

Фабрика (Factory Girl)

# 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'

Inтест, topic.valid? является верным, а topic.name имеет заводское значение.

Тем не менее, публикация, похоже, не прошла мимо post :create, :topic => topic.Похоже, что он никогда не сохраняется в базе данных, поскольку у него даже нет идентификатора в тестовом выводе.

Редактировать : Даже если я пропущу Фабрику для новой темы, он нене работает.

  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

Результаты с той же ошибкой теста.

Ответы [ 2 ]

1 голос
/ 08 мая 2011

Метод post здесь ожидает параметры в качестве второго аргумента, а не объекты. Это связано с тем, что действие create в вашем контроллере будет использовать метод params для извлечения этих параметров и использования их в процессе создания новой темы, используя такой код:

Topic.new(params[:topic])

Таким образом, ваш params[:topic] должен быть атрибутами проекта, который вы хотите создать, а не существующим Topic объектом. Однако вы можете использовать Factory.build :topic, чтобы получить экземплярный объект Topic, а затем сделать это, чтобы он заработал:

post :create, :topic => topic.attributes
0 голосов
/ 08 мая 2011

Это очень далеко от меня, но мне, видимо, пришлось вручную установить атрибут в параметрах 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 не сработает.

...