Rails: фабрики и ассоциации в функциональных тестах - PullRequest
1 голос
/ 20 февраля 2010

Я пытаюсь выяснить, почему это не работает.

Допустим, у вас есть три модели: Пользователь, Фу и Бар. Чтобы создать панель, пользователь должен сначала создать и проверить объект foo.

Class User #snip!
has_many :foos
has_many :bars

Class Foo #snip!
belongs_to :user
has_many :bars

Class Bar #snip!
belongs_to :user
belongs_to :foo

Я пытаюсь заставить работать функциональный тест, в котором, если пользователь пытается создать новый Bar без действительного foo, он перенаправляется на «новое» действие для Foo.

У меня не было проблем со сценарием перенаправления. Однако, когда я пытаюсь настроить пользователя с допустимым объектом Foo и пытаюсь получить «новое» действие для панели, оно все равно перенаправляется на «новое» действие контроллера Foo. Он по-прежнему не признает, что у пользователя есть Foo.

Вот мой контроллер:

 class BarsControllerTest < ActionController::TestCase
  setup :activate_authlogic
  def setup
    @request.env['HTTPS'] = nil
    @user = Factory.build(:user)
    @foo = Factory.build(:foo, :user => @user)
  end
   test "should get new when user has a valid foo" do
     @request.env['HTTPS'] = 'on'
     UserSession.create(@user)
     get :new
     assert_response :success
  end

Это функция перенаправления, которая есть в моем контроллере приложения, которая вызывается в моем контроллере панели:

  def foo_required
    if current_user && @current_user.foos.valid.empty? && @current_user.foos.empty?
    flash[:notice] = "You must have a verified foo in order to create a Bar!"
    redirect_to new_foo_path
    elsif current_user && @current_user.foos.valid.empty?
    flash[:notice] = "You must verify your foos in order to create a Bar!"
    redirect_to foos_path
    end
 end

Вот Фу Фабрика:

Factory.define :foo do |f|
   #attributes
   f.valid true
   f.association :user
end

Вместо этого меня перенаправляют на "https://test.host:80/foos/new" Контроллер не подтверждает, что у пользователя есть Foo ...

Сессия действительна, так что это похоже на заводскую проблему, но я не уверен, что это такое.

1 Ответ

3 голосов
/ 20 февраля 2010

Я предполагаю, что это factory_girl. Вы звоните Factory.build, который ничего не сохраняет в базе данных, поэтому у вас никогда не будет значения внешнего ключа, необходимого для вашей ассоциации. Переключите их на Factory.create, и вы увидите разницу.

...