1

Я пытаюсь понять, почему это не работает.Rails: Заводы и ассоциации в функциональных тестах

Предположим, вы три модели, Пользователь, Foo и Bar. Чтобы создать бар, пользователь должен сначала создать и проверить объект 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 

Я пытаюсь получить функциональный тест работает, где, если пользователь пытается сделать новую панель, не имея действительный 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 

Вот Foo Factory:

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

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

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

ответ

3

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

+0

Конечно, должно быть что-то просто! * хиты головы * Большое спасибо jdl, вы спасли меня в день притягивания волос! –

+0

Добро пожаловать. – jdl