Tengo un Rails Scaffold básico, todas las acciones del controlador están protegidas por un filtro que determina si el usuario actual es un administrador. En lugar de iniciar sesión con usuarios administradores y no administradores durante cada prueba del controlador, decidí crear un asistente que inicia sesión en un usuario y afirma una respuesta. Todas las pruebas del controlador funcionan correctamente, pero recibo un error de número incorrecto de argumentos en mis funciones auxiliares (que se muestran a continuación).
Fragmento del controlador:
class QuotesController < ApplicationController before_action :set_quote, only: [:show, :edit, :update, :destroy] before_action :admin_filter # GET /quotes def index @quotes = Quote.all end #... rest of actions... private # Returns true if user is admin def is_admin? current_user.boss if user_signed_in? end # Redirect If not Admin def admin_filter redirect_to root_path unless is_admin? end endAsistentes de prueba (reduce la redundancia de inicio y cierre de sesión de los usuarios):
# test_helper.rb class ActiveSupport::TestCase include Devise::Test::IntegrationHelpers # Add more helper methods to be used by all tests here... module AuthTesting # compacts admin_access and unsigned_no_admin to one test def test_authorization(path, admin, non_admin) # Error @ this line, stacktrace ends admin_access(path, admin) unsigned_no_admin_no_access(path, non_admin) end # asserts redirect for not signed in/ non admin users def unsigned_no_admin_no_access(path, non_admin) get path assert_response :redirect sign_in non_admin get path assert_response :redirect sign_out non_admin end # Asserts that admin has access def boss_access(path, admin) sign_in admin get path assert_response :success sign_out admin # prevents test_access from having leftover signed in admin end end endFragmento de prueba (todas las acciones del controlador funcionan correctamente y pasan la prueba)
class QuotesControllerTest < ActionDispatch::IntegrationTest include AuthTesting setup do @quote = quotes(:one) @admin = users :jack @non_admin = users :phil end test 'should get index only if admin' do test_authorization(quotes_path, @admin, @non_admin) # green end #... rest of test ... endEl error al ejecutar mi prueba:
ERROR["test_authorization", #<Minitest::Reporters::Suite:0x00007f8f009fa7e0 @name="QuotesControllerTest">, 0.3059480000000008] test_authorization#QuotesControllerTest (0.31s) Minitest::UnexpectedError: ArgumentError: wrong number of arguments (given 0, expected 3) test/test_helper.rb:20:in `test_authorization'¿Por qué recibo este error pero sigo teniendo todas mis pruebas funcionando correctamente? ¿No creé correctamente los asistentes de prueba?
No empieces los nombres de tus métodos auxiliares con test_ .
Esta es una convención en Minitest: todo lo que comienza con test_ es una prueba. Y así se invocará como tal, sin argumentos.