1

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

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

所以我猜有几个问题:

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

  2. 是否有适当的方法来清除工厂数据,使其只是功能和集成测试的种子数据?

工厂女孩现在完全是新手,只想正确地学习它,而不是通过它来破解我的方式。感谢您的任何意见。

4

1 回答 1

3

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

为数据库播种也会使您更难了解正在发生的事情,并且会导致您做出很多次最终不正确的假设。相反,使用工厂只添加测试所需的数据。这是一些额外的工作,但它是值得的,因为:

  1. 消除你的假设
  2. 确保干净和一致的测试环境
  3. 将测试的所有数据保留在测试中

另外,rspec 具有before(:each)before(:all)因此您可以在运行测试之前设置数据。因此,这并没有太多额外的工作。

但是一开始可能会让您感到困惑的一件事是,在使用 For 时,rspec 不会在测试运行之间清除数据库before(:all),我通常只是在一个after(:all)块中手动删除。所以我使用的经验法则是——在其中创建的任何内容都before(:all)应该在after(:all)

许多人也为此使用database_cleaner gem,但到目前为止我还不需要它。

于 2012-07-10T23:36:32.357 回答