У меня есть две модели: 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
Результаты с той же ошибкой теста.