2013-10-22 20 views
2

我们有非常大的rails应用程序,目前我们正在从TestUnit/fixture转换到Rspec/FactoryGirl。我们的数据库有很多“系统”表,其中数据不变或很少更新。例如FactoryGirl,Rspec和复杂的数据库结构

user_types 
ID NAME      ... 
1 System Adminisrator  ... 
2 Organization Administrator ... 
.... 
9 Mega Administrator   ... 

另外我们有很多配置表和它们之间的长引用。例如:

master_organizations many-to-many organizations has_many 
plan_years has_many products has_many plans 

organizations has_many employees ... and so on 

而且我们需要在所有规格运行之前配置所有系统表和至少一个组织。然后,如果需要,每个套件都可以将其他数据添加到数据库。

所以问题是如何构建一个好的,复杂的和灵活的结构,这对于开发人员是可读的?今天,我们最接近的解决方案是将db结构创建移动到单独的文件中:为系统表,配置表等创建shared_contexts。然后在必要时加入。但不确定这种方法是否好。

回答

2

好的,所以你几乎有恒定的数据,几乎将永远存在。在生产中,在您的开发机器上,在每次测试运行中等等。然后您的数据会发生变化;在生产过程中,它是由用户生成的数据,在需要进行模拟的测试中。

现在我们只需要为每项工作使用正确的工具。几乎是恒定的数据是什么种子是为,而模拟变化的数据是工厂闪耀。

由Rails提供的种子并不是那么棒,但由于一些宝石的缘故,它可以变得非常好。

SeedFu为您提供了一个很好的DSL,用于定义在随后的运行中不会重复的种子。例如。

User.seed_once(:email, 
    { :email => "[email protected]", :name => "Jon" }, 
    { :email => "[email protected]", :name => "Emily" } 
) 

Seedbank给出了一些很好所需结构种子文件。它覆盖了默认的rake db:seed任务,并为各地不需要的种子提供环境特定的文件夹。所以你会有这样的东西:

db/seeds/ 
    development/ 
    users.seeds.rb 
    organizations.seeds.rb 
    user_types.seeds.rb 

这样,你不需要有很多重叠的概念(夹具等)。种子处理常数数据,工厂主要处理测试特定的数据。希望它会有用处。

注意:如果您的测试可以是独立的,并且不依赖种子或其他数据库状态,那当然更好。但实际上,您的一些数据与其周围的模型一样,也是您的应用程序的一部分。我们的方法可能带来一些麻烦(总是在迁移,数据库清理策略上运行种子),但迄今为止它对我们很有用。调整适合您的用例的部分。