【发布时间】:2014-08-24 19:02:58
【问题描述】:
在我的 Rails 4 项目中,我有一个模型 EventGenerator 和一个实例方法 generate(它在数据库中创建一些记录)和一个类方法 generate_all,它打算由Rake 任务看起来像这样:
def self.generate_all
all.each(&:generate)
end
我可以想到几种测试方法(我正在使用 RSpec 3 和 Fabrication):
- 不要打扰 - 要求测试太简单了。 DHH 说"Don't aim for 100% coverage"。另一方面,这将由 rake 任务调用,因此不会定期执行:我觉得这是进行测试的好理由。
- 在数据库中创建几个
EventGenerator实例并使用any_instance.should_receive(:generate)作为断言 - 但RSpec 3 now recommends against this 需要软糖才能使其工作。这是一个个人的“展示项目”,所以如果可能的话,我希望一切都是最佳实践。另外(DHH 除外)是否仍然可以创建不涉及数据库的快速模型规范? - 与 2 类似,但存根
EventGenerator.all以返回一些实例而不接触数据库。但是对被测类进行存根是不好的,对吧?而且很脆弱。 - 不要担心对其进行单元测试,而是用集成测试来覆盖它:在数据库中创建几个生成器,运行该方法,然后检查数据库中更改/创建的内容。
- 更改实现:传入实例数组。但这只是将问题推后了一层,并且是测试驱动的更改,我看不出对设计有什么好处。
由于我真的想不出选项 4 的缺点,也许这就是答案,但我觉得我需要一些科学来支持它。
【问题讨论】:
标签: ruby-on-rails ruby unit-testing rspec