Pruebas de ferrocarriles no trabajando con métodos modelo en vistas
Cuando las pruebas con carriles, llamar métodos modelo dentro de una vista no funciona. ¿Hay alguna razón para esto? Todas las funciones funcionan al acceder a la página dentro del navegador sin ningún problema.
La línea de visión causa problemas:
<%= f.select :user_id, options_for_select(@project.assignment_options(current_user)),
{ include_blank: "Teammate to assign" }, class: "uk-select uk-margin-small-right" %>
El examen:
def current_user
@user
end
setup do
@user = users(:one)
sign_in @user
@project = projects(:one)
@project.owner_id = @user.id
@assignment = assignments(:one)
end
test "should get new" do
get new_project_assignment_url(@project.slug)
assert_response :success
end
El error:
E
Error:
AssignmentsControllerTest#test_should_get_new:
ActionView::Template::Error: Couldn't find User without an ID
app/models/project.rb:33:in `owner'
app/models/project.rb:63:in `assignment_options'
app/views/assignments/_form.html.erb:6
app/views/assignments/_form.html.erb:2
app/views/assignments/new.html.erb:2
test/controllers/assignments_controller_test.rb:18:in `block in '
Cuando hago un "puts current_user.id" desde la vista y prueba que coinciden, por lo que definitivamente hay un id de usuario disponible en la página, pero todavía estoy golpeando este problema. He intentado hacer pruebas para diferentes páginas que tienen diferentes métodos de modelo, y todos fallan con el mismo error.
Pregunta hecha hace 3 años, 4 meses, 29 días - Por pixelpilot
3 Respuestas:
-
El problema era que no estaba guardando el proyecto actualizado. Necesitaba usar @project.update. Hubo un comportamiento extraño que cuando actualicé el owner_id, el slug también actualizado por ninguna razón aparente, pero trabajé alrededor de él simplemente creando un nuevo proyecto en lugar de usar un dispositivo.
Respondida el Dec 17, 2020 a las 02:55 - por htmlhero
Votos positivos: 0 | Votos negativos: 0 -
El error que estás experimentando se debe a que dentro de la vista estás llamando al método
@project.assignment_options(current_user)
que a su vez depende de los métodosowner
yuser_id
de los modelosProject
yUser
respectivamente.En tu test de controlador, estás llamando a
new_project_assignment_url(@project.slug)
en el cual pasas el slug del proyecto. Sin embargo, al parecer el problema radica en la forma en que se está manejando el usuario actual (current_user
) en este contexto de prueba.El error en la consola indica que no se puede encontrar un usuario sin un ID, lo que sugiere que el objeto
@user
encurrent_user
no está siendo definido correctamente en el contexto de la prueba.Te recomendaría revisar la forma en que estás configurando el objeto
@user
en tu métodosetup
dentro de tu test. Verifica si estás manejando correctamente la autenticación del usuario en el contexto de la prueba, ya que parece que el usuario actual no se está asignando correctamente.Asegúrate de que el usuario esté correctamente autenticado en el contexto de la prueba antes de intentar acceder a la vista que llama a métodos que dependen del usuario actual.
Una posible solución sería verificar la forma en que manejas la autenticación del usuario en tus pruebas y asegurarte de que el objeto
@user
se defina correctamente en el contexto de cada prueba antes de acceder a las vistas que dependen de él.Espero que esta información te ayude a resolver el problema. ¡Déjame saber si tienes alguna otra pregunta o duda!
Respondida el Dec 18, 2020 a las 02:55 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El error indica que no se puede encontrar un usuario sin un ID. Esto se debe a que el método
current_user
en la prueba devuelvenil
en lugar del usuario esperado.Para solucionar este problema, asegúrate de que el método
current_user
devuelva el usuario correcto en la prueba. Una forma de hacerlo es pasar el usuario a la prueba como argumento:ruby test "should get new" do get new_project_assignment_url(@project.slug, user: @user) assert_response :success end
También es importante asegurarse de que el usuario pasado a la prueba tenga un ID válido. Puedes hacerlo en el método
setup
antes de crear el usuario:ruby setup do @user = create(:user, id: 1)
Asigna un ID explícito al usuario para evitar el error "Couldn't find User without an ID"
sign_in @user @project = projects(:one) @project.owner_id = @user.id @assignment = assignments(:one) endRespondida el Dec 18, 2020 a las 03:05 - por Gemini
Votos positivos: 0 | Votos negativos: 0