Include module in all MiniTest tests like in RSpec

久未见 提交于 2019-12-04 19:47:26

问题


In RSpec I could create helper modules in /spec/support/...

module MyHelpers
  def help1
    puts "hi"
  end
end

and include it in every spec like this:

RSpec.configure do |config|
  config.include(MyHelpers)
end

and use it in my tests like this:

describe User do
  it "does something" do
    help1
  end
end

How can I include a module into all MiniTest tests without repeating myself in every test?


回答1:


minitest does not provide a way to include or extend a module into every test class in the same way RSpec does.

Your best bet is going to be to re-open the test case class (differs, depending on the minitest version you're using) and include whatever modules you want there. You probably want to do this in either your test_helper or in a dedicated file that lets everyone else know you're monkey-patching minitest. Here are some examples:

For minitest ~> 4 (what you get with the Ruby Standard Library)

module MiniTest
  class Unit
    class TestCase
      include MyHelpers
    end
  end
end

For minitest 5+

module Minitest
  class Test
    include MyHelperz
  end
end

You can then use the included methods in your test:

class MyTest < Minitest::Test # or MiniTest::Unit::TestCase
  def test_something
    help1
    # ...snip...
  end
end

Hope this answers your question!




回答2:


From the Minitest README:

=== How to share code across test classes?

Use a module. That's exactly what they're for:

module UsefulStuff
  def useful_method
    # ...
  end
end

describe Blah do
  include UsefulStuff

  def test_whatever
    # useful_method available here
  end
end

Just define the module in a file and use require to pull it in. For example, if 'UsefulStuff' is defined in test/support/useful_stuff.rb, you might have require 'support/useful_stuff' in either your individual test file.

UPDATE:

To clarify, in your existing test/test_helper.rb file or in a new test/test_helper.rb file you create, include the following:

Dir[Rails.root.join("test/support/**/*.rb")].each { |f| require f }

which will require all files in the test/support subdirectory.

Then, in each of your individual test files just add

require 'test_helper'

This is exactly analogous to RSpec, where you have a require 'spec_helper' line at the top of each spec file.




回答3:


One thing I will do is create my own Test class inheriting from Minitest::Test. This allows me to do any sort of configuration on my base test class and keeping it isolated to my own project1.

# test_helper.rb
include 'helpers/my_useful_module'
module MyGem
  class Test < Minitest::Test
    include MyUsefulModule
  end
end

# my_test.rb
include 'test_helper'
module MyGem
  MyTest < Test
  end
end

1 This is most likely unneeded, but I like keeping all my gem code isolated.



来源:https://stackoverflow.com/questions/19841510/include-module-in-all-minitest-tests-like-in-rspec

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!