使用Factory Girl进行测试时正确处理数据库的方法

时间:2012-07-10 23:02:19

标签: ruby-on-rails ruby-on-rails-3 testing factory-bot fixtures

我正在尝试将使用Fixtures的Rails 3应用程序移动到Factory Girl,并且我不完全确定正确的数据库方法。 (请注意,我正在使用Rspec进行测试。)

我有一个seeds.db,其中包含我的功能和集成测试所需的数据,但是当涉及到我的Role模型的模型测试时,此种子数据可能会进入如果我想从工厂创建管理员角色的方式,但是我的种子数据库中已经有一个管理员角色,名称列必须是唯一的。此外,我在这些模型测试中创建的任何数据都可能会干扰我的集成测试,因为我会有额外的数据,这是我不期望的。

我想有几个问题:

  1. 在单元测试中处理数据库的正确方法是什么?我需要其他测试的种子数据,但它们现在似乎正在“阻碍”。我是否被迫用序列制作独特的数据,或者是否有办法加载种子数据仅用于功能和集成测试等?

  2. 是否有正确的方法来清除工厂数据,以便它只是功能和集成测试的种子数据?

  3. 现在对Factory Girl来说是全新的,只是想要正确地学习它而不是通过它来破解我的方式。感谢您的任何意见。

1 个答案:

答案 0 :(得分:3)

在测试中处理数据库数据的“正确”方法是在每次测试运行之前确保它是干净且一致的。很多人(包括我自己)不会为数据库播种,而是使用工厂。

播种数据库也会让人更难知道发生了什么,并且它会导致您做出多次最终错误的假设。相反,使用工厂只添加测试所需的数据。这是一些额外的工作,但它是值得的,因为:

  1. 删除您的假设
  2. 确保清洁一致的测试环境
  3. 在测试中保留测试的所有数据
  4. 另外,rspec有before(:each)before(:all),因此您可以在运行测试之前设置数据。所以这不是多余的工作。

    但有一件事可能会让你感到高兴的是,当使用before(:all)时,rspec不会在测试运行之间清除数据库。为此我通常只在after(:all)块中手动删除。所以我使用的经验法则是 - before(:all)中创建的任何内容都应该在after(:all)中删除

    许多人也使用database_cleaner宝石,但到目前为止我还没需要它。