在Rspec中使用数据库查询是否合适?

时间:2012-07-26 12:10:11

标签: ruby-on-rails rspec mocking stubbing

我已经开始使用Rspec为一个非常古老的项目编写测试。我正在测试的模型都是ActiveRecords(后端是Oracle)。 我读过一些博客说我们应该使用模拟和存根/固定装置/工厂女孩来解雇实际的sql。 我很迷惑。我将不得不存储很多方法并创建大量对象。这是一个好习惯吗?

2 个答案:

答案 0 :(得分:7)

在测试模型时,最好让测试与数据库集成。也就是说,不要试图模仿ActiveRecord的东西,只使用模型对象。 FactoryGirl和Fabrication都是构建真实模型对象的便捷捷径,在测试ActiveRecord模型时它们是最佳实践。

由于这是遗留代码,我建议不要在旧代码中进行过多的嘲弄或抄写,因为隔离只适用于每个组件都是单独测试的。

但是,使用TDD编写代码时,模拟和存根有很多好处:

  • 为您提供细粒度的测试(如果方法中断,您的测试会告诉您哪一个)
  • 您的测试运行得更快,因此您的TDD周期更短
  • 让您对代码与其他对象的交互方式进行断言
  • 如果你必须过度地模拟和模拟其他模型以隔离一个模型,通常是一个好的迹象,表明你的代码耦合太高而且值得一个重构

答案 1 :(得分:1)

通常您会使用存根,然后您可以在不加载AR的情况下运行测试,并且运行速度会快得多。

我个人认为测试假数据不是测试...也许在开发环境中进行TDD ...也许......,但对于测试环境,它应该尽可能接近真实数据。

这当然是我的意见,可能不是目前的思想流派。