Rails: fábricas e associações em testes funcionais
-
21-09-2019 - |
Pergunta
Estou tentando descobrir por que isso não funciona.
Digamos a você três modelos, usuário, foo e bar. Para que um bar seja criado, o usuário deve primeiro criar e validar um objeto 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
Estou tentando fazer um teste funcional funcionando, onde, se o usuário tentar fazer uma nova barra sem ter um Foo válido, será redirecionado para a ação "nova" para um Foo.
Não tive nenhum problema com o cenário de redirecionamento. No entanto, quando tento configurar um usuário com um objeto Foo válido e tento obter a ação "nova" para uma barra, ele ainda é redirecionado para a ação "nova" do controlador Foo. Ainda não reconhece que o usuário tem um foo.
Aqui está meu controlador:
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
Esta é a função de redirecionamento que tenho no meu controlador de aplicativos chamado no meu controlador de barras:
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
Aqui está a fábrica Foo:
Factory.define :foo do |f|
#attributes
f.valid true
f.association :user
end
Em vez disso, sou redirecionado para "https://test.host:80/foos/new"O controlador não reconhece que o usuário tem um foo ...
A sessão é válida, então isso parece um problema de fábrica, mas não tenho certeza do que é.
Solução
Estou assumindo que este é Factory_Girl. Você está ligando Factory.build
O que não economiza nada no banco de dados, para que você nunca tenha o valor da chave estrangeira necessária para sua associação. Mude -os para Factory.create
E você deve ver a diferença.