【问题标题】:How to test a Rails Model Class method which calls a method on all members?如何测试在所有成员上调用方法的 Rails 模型类方法?
【发布时间】:2014-08-24 19:02:58
【问题描述】:

在我的 Rails 4 项目中,我有一个模型 EventGenerator 和一个实例方法 generate(它在数据库中创建一些记录)和一个类方法 generate_all,它打算由Rake 任务看起来像这样:

def self.generate_all
  all.each(&:generate)
end

我可以想到几种测试方法(我正在使用 RSpec 3 和 Fabrication):

  1. 不要打扰 - 要求测试太简单了。 DHH 说"Don't aim for 100% coverage"。另一方面,这将由 rake 任务调用,因此不会定期执行:我觉得这是进行测试的好理由。
  2. 在数据库中创建几个EventGenerator 实例并使用any_instance.should_receive(:generate) 作为断言 - 但RSpec 3 now recommends against this 需要软糖才能使其工作。这是一个个人的“展示项目”,所以如果可能的话,我希望一切都是最佳实践。另外(DHH 除外)是否仍然可以创建不涉及数据库的快速模型规范?
  3. 与 2 类似,但存根 EventGenerator.all 以返回一些实例而不接触数据库。但是对被测类进行存根是不好的,对吧?而且很脆弱。
  4. 不要担心对其进行单元测试,而是用集成测试来覆盖它:在数据库中创建几个生成器,运行该方法,然后检查数据库中更改/创建的内容。
  5. 更改实现:传入实例数组。但这只是将问题推后了一层,并且是测试驱动的更改,我看不出对设计有什么好处。

由于我真的想不出选项 4 的缺点,也许这就是答案,但我觉得我需要一些科学来支持它。

【问题讨论】:

    标签: ruby-on-rails ruby unit-testing rspec


    【解决方案1】:

    实际上我不会费心去测试它(所以你的 1.),因为这个方法真的很简单。

    如果你想让它在测试范围内,虽然我建议你使用你的 3。我的原因如下:

    • 您对.generate_all 的测试只需要断言#generate 方法会在.all 返回的每个实例上得到调用。在这种情况下,.all 的实际实现是无关紧要的,可以被存根。
    • 您对#generate 的测试应该断言该方法做了正确的事情。如果这些测试断言此方法的正常运行,则 .generate_all 的测试无需重复任何断言。
    • .generate_all 的测试中测试#generate 的正常运行会导致测试之间出现不必要的依赖关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多