Minitest:集成测试、模板模式和 NotImplementedError

Minitest: Integration test, Template pattern and NotImplementedError

假设我有以下 class:

class AbstractClass
  # code omitted

  def get_from_api(data)
    APIRequestClass.send_request(config_info: config_info(data))
  end

  # force subclass to add method w/ proper config hash
  def config_info(data)
    raise NotImplementedError
  end
end

我想编写一个向 API 提交请求的集成测试。但是,我需要定义 config_info 来执行此操作。这是我为完成这项工作所做的尝试之一:

# abstract_class_test.rb
# once this works I would remove class declaration to helper file
require_relative '../test_setup'

class SpecificClass < AbstractClass
  def config_info(data)
    {
      sample: "Foo",
      data:   data
    }
  end
end


class AbstractClassTests < MiniTest::Test

  def setup
    @instance = SpecificClass.new
  end

  def test_that_something_comes_back_from_api
    puts @instance.config_info("data")
    response = @instance.get_from_api("data")

    assert_equal jobs.class, Array
  end

end

puts 语句导致 NotImplementedError

现在我将简单地测试 APIRequestClass.send_request 方法并传入适当的散列。我仍然对我上面提出的问题很感兴趣,但也许第四个问题是:从 AbstractClass 开始一直测试此功能与从 APIRequestClass 开始测试相比是否有显着优势?

is there a significant advantage in testing this functionality all the way from AbstractClass, versus simply testing it from APIRequestClass?

看起来唯一被测试的是抽象 class 的未实现方法,所以也许不是?从某种角度来看,抽象 class 是特定 classes 的实现细节,因此测试特定 classes 可能更有意义。

is there a better way to force the end user to provide the configuration information needed to make the API request?

配置和数据似乎可以是 send_request 的两个独立的必需参数,它们在方法内部组合在一起。这可能会让你完全摆脱抽象 class。

is there a better way to write an integration test in this instance (i.e. not defining a SpecificClass)

根据上述内容,您可以测试配置和数据是否已正确组合到 APIRequestClass 上的 API 负载中。那时可能没有任何东西可以测试特定的 class。