如何使用 Minitest 拆分测试方法以便在多种情况下重用?

How can I split test methods for reuse in multiple case with Minitest?

我阻止重构我的 Minitest 文件中的代码。

我有这个例子:

test_calls.rb

describe Aircall::Calls do
 before do
  @call_by_id = DefaultAircall::AIRCALL.calls.get_by_id(34043501)
  @call_by_user_id = DefaultAircall::AIRCALL.calls.get_by_user_id(80603)
 end

 describe "By id" do
  it "is Hash" do
    @call_by_id.must_be_instance_of Hash
  end

  it "no error return" do
    @call_by_id['error'].must_be_nil
  end
 end

 describe "by user id" do
  it "is Hash" do
    @call_by_user_id.must_be_instance_of Hash
  end

  it "no error return" do
    @call_by_user_id['error'].must_be_nil
  end
 end
end

test_users.rb

describe Aircall::Users do
describe "By id" do

  before do
    @user_by_id = DefaultAircall::AIRCALL.users.get_by_id(80603)
  end

  it "is Hash" do
    @user_by_id.must_be_instance_of Hash
  end

  it "no error return" do
    @user_by_id['error'].must_be_nil
  end

 end
end

理想情况下,我想将我的代码拆分到另一个文件中,如下所示:

class DefaultTest
 def initialize(element_to_test)
  @element_to_test = element_to_test
 end

 def defaults_tests
  describe "default" do
   it "is Hash" do
    @element_to_test.must_be_instance_of Hash
   end

   it "no error return" do
    @element_to_test['error'].must_be_nil
   end
  end
 end
end

所以,我可以在不同的测试文件中导入我的默认测试

我不知道这是否可能以及如何实现。我想我已经成功了一次,但是测试没有出现在控制台中。如果我调用一个 class 方法 运行 一些 Minitest 测试,我的任务(运行 测试)不考虑我的默认测试。

据我所知,您无法完成您想要做的事情。这里的问题是 it 只能从 describe 块中调用。 it 将无法在该块调用 的方法中使用。

我做了一些实验。我能想到的最好办法是,可以在 describe 块中定义一个 lambda,并由该 describe 中的所有 it 块使用。 (这样用常规方法是不行的。)

这是一个例子:

require "minitest/autorun"

class MyTest < Minitest::Test

  describe 'number test' do

    # It is not legal to define a method here,
    # you'll get this error when trying to call it:
    # "undefined method `is_odd'"

    # def is_odd(number)
    #   it 'is odd' do
    #     assert_equal (number / 2), 1
    #   end
    # end

    is_odd_lambda = ->(number) do
      it 'is odd' do
        assert_equal (number / 2), 1
      end
    end


    # is_odd(3)
    is_odd_lambda.(3)
  end
end

调用is_odd方法会出错,但调用is_odd_lambda不会。

Keith Bennett 好主意! Lambda 是一个很好的方法。

我现在有了解决方案:

我的 lambda 模块 运行 默认测试: default_tests.rb

module DefaultTest

 Run = ->(*variables_to_test) do
  describe "Default test" do
   variables_to_test.each do |variable|

    it "is Hash" do
      self.class.send(variable).must_be_instance_of Hash
    end

    it "no error return" do
      self.class.send(variable)['error'].must_be_nil
    end

   end
  end
 end

end

test_contacts.rb

module TestAircall
 describe Aircall::Contacts do

  def self.contact_by_id
   @contact_by_id ||= DefaultAircall::AIRCALL.contacts.get_by_id(ENV['TEST_DEFAULT_CONTACT_ID'])
  end

  def self.contact_by_phone_number
   @contact_by_phone_number ||= DefaultAircall::AIRCALL.contacts.get_by_phone_number(ENV['TEST_DEFAULT_PHONE_NUMBER'])
  end

  def self.contact_by_email
   @contact_by_email ||= DefaultAircall::AIRCALL.contacts.get_by_email(ENV['TEST_DEFAULT_EMAIL'])
  end

  DefaultTest::Run.('contact_by_id', 'contact_by_phone_number', 'contact_by_email')
 end
end

test_users.rb

module TestAircall
 describe Aircall::Users do
  def self.user_by_id
   @user_by_id ||= DefaultAircall::AIRCALL.users.get_by_id(ENV['TEST_DEFAULT_USER_ID'])
  end

  DefaultTest::Run.('user_by_id')
 end
end

我可以在每个文件测试中调用并 运行 我的默认测试来测试任何变量。