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?
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étodocurrent_user_role
y luego verificar siuser_operator?
devuelve el valor esperado. Aquí hay un ejemplo:En esta prueba modificada, llamamos al método
set_site
haciendo una solicitud GET a la ruta raíz con el parámetroshop_id
. Luego llamamos explícitamente al métodocurrent_user_role
para establecer la variable de instancia@cu_rsu
. Finalmente, utilizamos la instrucciónassert_equal
para verificar siuser_operator?
devuelve el valor esperado en función del objetoroleshopuser
y la variable de instancia@operator_roles
.