我正在尝试将使用Fixtures的Rails 3应用程序移动到Factory Girl,并且我不完全确定正确的数据库方法。 (请注意,我正在使用Rspec进行测试。)
我有一个seeds.db
,其中包含我的功能和集成测试所需的数据,但是当涉及到我的Role
模型的模型测试时,此种子数据可能会进入如果我想从工厂创建管理员角色的方式,但是我的种子数据库中已经有一个管理员角色,名称列必须是唯一的。此外,我在这些模型测试中创建的任何数据都可能会干扰我的集成测试,因为我会有额外的数据,这是我不期望的。
我想有几个问题:
在单元测试中处理数据库的正确方法是什么?我需要其他测试的种子数据,但它们现在似乎正在“阻碍”。我是否被迫用序列制作独特的数据,或者是否有办法加载种子数据仅用于功能和集成测试等?
是否有正确的方法来清除工厂数据,以便它只是功能和集成测试的种子数据?
现在对Factory Girl来说是全新的,只是想要正确地学习它而不是通过它来破解我的方式。感谢您的任何意见。
答案 0 :(得分:3)
在测试中处理数据库数据的“正确”方法是在每次测试运行之前确保它是干净且一致的。很多人(包括我自己)不会为数据库播种,而是使用工厂。
播种数据库也会让人更难知道发生了什么,并且它会导致您做出多次最终错误的假设。相反,使用工厂只添加测试所需的数据。这是一些额外的工作,但它是值得的,因为:
另外,rspec有before(:each)
和before(:all)
,因此您可以在运行测试之前设置数据。所以这不是多余的工作。
但有一件事可能会让你感到高兴的是,当使用before(:all)
时,rspec不会在测试运行之间清除数据库。为此我通常只在after(:all)
块中手动删除。所以我使用的经验法则是 - before(:all)
中创建的任何内容都应该在after(:all)
中删除
许多人也使用database_cleaner宝石,但到目前为止我还没需要它。