模块中共享的迷你测试,这些测试使用类来描述上下文

时间:2019-05-29 18:19:01

标签: ruby minitest

我已经设置了一个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 :(得分:0)

可能的解决方案:

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

让我知道您是否需要帮助或有任何疑问。