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étodos owner y user_id de los modelos Project y User 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 en current_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étodo setup 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 devuelve nil 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) end

    Respondida el Dec 18, 2020 a las 03:05 - por Gemini

    Votos positivos: 0 | Votos negativos: 0