es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Invocando el método ApplicationController en Minitest.

El controlador de la aplicación cuenta con una acción antes que establece algunos métodos en secuencia (sitio establece tienda, usuario tiene roles a través de una tabla join)

class ApplicationController < ActionController::Base
  before<em>action :set</em>site

<p>protected</p>

<p>def set<em>site
    @shop = Shop.find(params[:shop</em>id].to<em>i)
    [...]
    role</em>sets
    current<em>user</em>role
  end</p>

<p>def role<em>sets
    @operator</em>roles = [2,3,4,5]
  end</p>

<p>def current<em>user</em>role
    @cu<em>rsu = Roleshopuser.where('user</em>id = ? AND shop<em>id = ?', current</em>user.id, @shop.id).first
    user_operator?
  end</p>

<p>def user<em>operator?
    @user</em>operator = (!@cu<em>rsu.nil? && @operator</em>roles.include?(@cu<em>rsu.role</em>id))
  end
<code>
Si bien las funciones funcionan en modo de desarrollo, la siguiente prueba falla porque algunas de las variables de instancia del controlador son manejadas y otras no
</code>
require 'test_helper'</p>

<p>class ApplicationControllerTest < ActionDispatch::IntegrationTest</p>

<h1>include Devise::Test::IntegrationHelpers  in test_helper</h1>

<p>def current<em>user
    @current</em>user
  end</p>

<p>test 'current<em>user role' do
    @operators.each do |roleshopuser|
      sign</em>in roleshopuser.user
puts roleshopuser.role<em>id
puts @operator</em>roles
puts @cu<em>rsu.nil?
      puts user</em>operator?
    end
  end
<code>
tal como se evidencia en la respuesta de minitest
</code>5
2
3
4
5
true
E</p>

<p>Error:
ApplicationControllerTest#test<em>current</em>user<em>role:
NoMethodError: undefined method <code>user_operator?' for #<ApplicationControllerTest:0x00007fae170d73d0>

entonces, la variable de instancia @operator se recoge, pero @cu<em>rsu es nula, lo que implica que el método current_user_role no se invoca. [sí, hay un @shop en la configuración]

¿Cómo puedo asegurarme de que se llame a un método desde una prueba?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para asegurarnos de que un método sea llamado desde una prueba, podemos utilizar la instrucción assert para verificar si se ejecuta el comportamiento esperado. En este caso, podemos modificar la prueba para llamar explícitamente al método current_user_role y luego verificar si user_operator? devuelve el valor esperado. Aquí hay un ejemplo:

    test 'rol de usuario actual' do
      @operators.each do |roleshopuser|
        sign_in roleshopuser.user
    
        # Llama al método set_site para inicializar las variables de instancia
        get root_path, params: { shop_id: @shop.id }
    
        # Llama al método current_user_role para establecer la variable de instancia @cu_rsu
        controller.send(:current_user_role)
    
        # Verifica si user_operator? devuelve el valor esperado
        assert_equal roleshopuser.role_id.in?(@operator_roles), controller.send(:user_operator?)
      end
    end
    

    En esta prueba modificada, llamamos al método set_site haciendo una solicitud GET a la ruta raíz con el parámetro shop_id. Luego llamamos explícitamente al método current_user_role para establecer la variable de instancia @cu_rsu. Finalmente, utilizamos la instrucción assert_equal para verificar si user_operator? devuelve el valor esperado en función del objeto roleshopuser y la variable de instancia @operator_roles.

Comments are closed.