#ruby-on-rails #ruby #testing #devise #integration-testing
Вопрос:
У меня есть базовый каркас Rails, все действия контроллера защищены фильтром, который определяет, является ли текущий пользователь администратором. Вместо того, чтобы регистрировать пользователей с правами администратора и пользователей без прав администратора во время каждого теста контроллера, я решил создать помощника, который регистрирует пользователей и выдает ответ. Все тесты контроллера работают правильно, но я получаю обалденную ошибку с неправильным количеством аргументов в своих вспомогательных функциях( показано ниже ).
Фрагмент контроллера:
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
end
Помощники по тестированию (уменьшите избыточность входа и выхода пользователей):
# 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
end
Фрагмент теста (все действия контроллера работают правильно и проходят тест)
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 ...
end
Ошибка при запуске моего теста:
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'
Почему я получаю эту ошибку, но все равно все мои тесты работают правильно? Разве я неправильно создал помощников по тестированию?
Ответ №1:
Не начинайте имена ваших вспомогательных методов с test_
.
Это соглашение в Minitest: все, с чего начинается test_
, — это тест. И поэтому он будет вызван как таковой, без аргументов.