Общие мини-тесты в модулях, которые используют классы для описания контекста - PullRequest
2 голосов
/ 29 мая 2019

У меня настроен тест контроллера minitest следующим образом:

module Api::V1
  module Foos
    class FoosControllerTest < ActionController::TestCase

      class IndexTest < self

        class NotLoggedInTest < self

          test 'it denies access' do
            perform_request
            assert_response :unauthorized
          end
        end

        class AdminLoggedInTest < self

          def perform_request
            sign_in admin_user
            super
          end

          test 'it allows admins access' do
            perform_request
            assert_response :success
          end
        end

        def perform_request
          get :index, format: :json
        end
      end

    end
  end
end

Он использует вложенные классы (например, IndexTest) для разделения различных контекстов теста, в то же время позволяя использовать некоторые функции.

Теперь мне нужен этот точный тест для другого контроллера, поэтому я пытаюсь создать модуль, который при включении будет динамически определять различные тестовые классы и позволять им наследовать от включающего класса.

Например (это не работает):

module Support
  module SharedControllerTest
    extend ActiveSupport::Concern

    included do |base|
      base.const_set 'IndexTest', Class.new(base) do

            # For example
            test 'it works' do
              assert_nil nil
            end

      end
    end
  end
end

Это не с NoMethodError: undefined method 'setup' for #<Class:0x00000004821fc8>.

Как мне создать модуль, который при включении может динамически определять мои разные тестовые классы и устанавливать их для наследования от включающего класса?

Редактировать 1:

Я пытаюсь включить этот модуль в контроллер следующим образом:

module Api::V1
  module Foos
    class FoosControllerTest < ActionController::TestCase
      include Support::SharedControllerTest
    end
  end
end

1 Ответ

0 голосов
/ 05 июня 2019

Возможное решение:

module Support
  module SharedControllerTest
    def self.included(base)
      base.const_set "IndexTest", Class.new(base) {
        test 'it works' do
          assert_nil nil
        end
      }
    end
  end
end


module Api::V1
  module Foos
    class FoosControllerTest < ActionController::TestCase
      include Support::SharedControllerTest
    end
  end
end

Дайте мне знать, если вам нужна помощь или у вас есть вопросы.

...