Проверьте, есть ли у класса пропуск перед действием для тестирования в Rails - PullRequest
0 голосов
/ 21 марта 2019

Можно ли проверить, есть ли у контроллера skip_before_action для одного конкретного действия?

Например:

class AuthenticationController < ApplicationController
    skip_before_action :authenticate_user
    ...
end

А затем проверьте что-то вроде этого:

AuthenticationController.has_skip_before_action(:authenticate_user)?

Я хочу сделать эту проверку для моих тестов контроллеров. Если у RSpec есть что-то подобное, я могу использовать. Я использую Rails 5.1.

Ответы [ 2 ]

3 голосов
/ 21 марта 2019

Должны ли вы? Нет. Подобно тому, что написал Veridian Dynamics , вы хотите проверить поведение, не обязательно наличие метода.

Тем не менее, возможно ли это сделать? Да. Вот игрушечный пример, который вам подойдет:

class AuthenticationController < ApplicationController
  skip_before_action :authenticate_user

  def index
  end
end

# authentication_controller_spec.rb
test "should get index" do
  # Have to make a request first to instantiate the controller variable
  get authentication_url

  # Convert this to a clearer method in your real code
  result = controller.__callbacks.first.last.map(&:filter).include?(:authenticate_user)

  # Assert on result ...
end

Чтобы объяснить код, вы используете экземпляр AuthenticationController и копаетесь в приватных методах этого экземпляра, чтобы получить список обратных вызовов. Затем вы можете найти наличие или отсутствие вашего конкретного обратного вызова.

Это не очень хорошее решение, и я бы не хотел увидеть это в кодовой базе! Этот тест основан на внутренней функциональности платформы Rails, которая может измениться в любое время. Это делает такой тест хрупким и может провалиться во время обновлений фреймворка. Любой коллега, проверяющий этот код, потребовал бы очень конкретного объяснения того, почему это было абсолютно необходимо в нашей кодовой базе.

2 голосов
/ 21 марта 2019

Нет, но вы можете проверить, работает ли :authenticate_user, как ожидалось, проверив, что он либо делает , либо не делает то, что вы намеревались.

Как и во всех модульных тестах, речь идет не о «существует ли этот метод?», А о «этот метод делает то, что мы ожидаем?»Если метод не существует, мы не проверяем это, потому что нам все равно.Мы хотим, чтобы поведение соответствовало нашим ожиданиям, а не коду.Если наш код не соответствует нашим ожиданиям, мы должны исследовать, читать, реорганизовывать и т. Д. Но это человеческая работа, а не работа RSpec.

Я предполагаю, что вы просто пытаетесь быть СУХИМЫМ и избегатьпроверка аутентификации, если "skip_before_authentication" уже существует, но это действительно плохая идея, даже если бы это было возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...