Carriles: fábricas y Asociaciones en pruebas funcionales
-
21-09-2019 - |
Pregunta
Estoy tratando de averiguar por qué esto no funciona.
ejemplo de permiten tres modelos, el usuario, Foo y Bar. Para que una barra que se crea el usuario primero debe crear y validar un 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
Estoy tratando de conseguir un trabajo de prueba funcional en la que si los intentos de usuario para hacer una nueva barra sin tener un foo válida, se redirecciona a la "nueva" acción por un Foo.
No he tenido ningún problema con el escenario redireccionamiento. Sin embargo, cuando intento configurar un usuario con un objeto Foo válida y tratar de conseguir la "nueva" acción por una barra, todavía se le redirecciona a la "nueva" acción del controlador de Foo. Todavía no reconocer que el usuario tiene una Foo.
Aquí está mi 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 es la función de redirección que tengo en mi controlador de aplicación que se llama en mi controlador de barra:
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
Aquí está la fábrica de Foo:
Factory.define :foo do |f|
#attributes
f.valid true
f.association :user
end
En su lugar me redirigen a " https://test.host:80/foos/new" el controlador no reconocer que el usuario tiene un Foo ...
La sesión es válida para que éste parece ser un problema en la fábrica, pero no estoy seguro de lo que es.
Solución
Estoy asumiendo que esto es factory_girl. Que está llamando Factory.build
que no hace nada para guardar la base de datos, para que nunca tenga el valor de clave externa necesaria para su asociación. Cambiar aquellos a Factory.create
y debería ver una diferencia.