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

时间:2015-02-22 03:53:28

标签: ruby integration-testing minitest code-design

假设我有以下课程:

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。我在这里有两个与测试相关的问题:在这个实例中是否有更好的方法来编写集成测试(即没有定义SpecificClass),为什么不是SpecificClass&# 39;在方法查找路径中实现config_info?还有第三个问题悬停在所有这些问题上,即:是否有更好的方法可以强制最终用户提供发出API请求所需的配置信息?

更新

现在我只是测试APIRequestClass.send_request方法并传入适当的哈希值。我对上面提到的问题仍然非常感兴趣,但也许第四个问题是:从AbstractClass开始测试此功能是否有显着优势,而不是仅仅从{{1}进行测试}?

1 个答案:

答案 0 :(得分:1)

  

从AbstractClass一直测试这个功能有什么显着的优势,而不是简单地从APIRequestClass测试它?

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

  

是否有更好的方法可以强制最终用户提供发出API请求所需的配置信息?

似乎配置和数据可能是两个单独的,send_request所需的参数,它们在方法内部组合在一起。这可能会让你完全没有抽象课程。

  

是否有更好的方法在此实例中编写集成测试(即不定义SpecificClass)

根据上述内容,您可以测试配置和数据是否已正确合并到APIRequestClass上的API有效负载中。此时可能会或可能没有任何东西可以在特定课程上进行测试。