2007-05-15

每天一剂Rails良药之Extracting Test Fixtures From Live Data

关键字: Rails Extracting Test Fixtures From Live Data
Rails做单元测试时,我们自己手动去创建所有的fixtures会是个噩梦,有没有什么好的方案呢?
我们可以利用数据库里已有的数据,写一个rake tast来把数据库的数据复制出来到YAML文件里:
CreateFixturesFromLiveData/lib/tasks/extract_fixtures.rake
desc 'Create YAML test fixtures from data in an existing database.
Defaults to development database. Set RAILS_ENV to override.'

task :extract_fixtures => :environment do
  sql = "SELECT * FROM %s"
  skip_tables = ["schema_info"]
  ActiveRecord::Base.establish_connection
  (ActiveRecord::Base.connection.tables - skip_table).each do |table_name|
    i = "000"
    File.open("#{RAILS_ROOT}/test/fixtures/#{table_name}.yml", 'w') do |file|
      data = ActiveRecord::Base.connection.select_all(sql % table_name)
      file.write data.inject({}) {|hash, record|
        hash["#{table_name}_#{i.succ!}"] = record
        hash
      }.to_yaml
    end
  end
end

好了,现在我们运行rake extract_fixtures,则test/fixtures/目录下将生成每个表的数据的yml文件
评论
张云洁 2008-04-11
这个我看明白了,你好象没理解我的意思,我不是想要把全部的表都复制到夹具里面,而是我希望指定哪个表复制到夹具都可以!就是不知道该怎么修改!是不是传入一个参数还是什么?
hideto 2008-03-28
skip_tables = ["schema_info"] # 声明哪些表不要extract data
ActiveRecord::Base.connection.tables - skip_table的结果是要extract data的表名的数组

你仔细看看代码,将代码看懂,不要拿来主义。
张云洁 2008-03-28
今天看到这个文章感觉很好,但是我还想问个问题,就是如果我 不想把全部表的内容都复制到夹具里面,而是我只想让需要的几个表或是一个表的内容复制到夹具里面,我在rake extract_fixtures的时候后面是不是要写什么, 我该怎么做?
发表评论

您还没有登录,请登录后发表评论

hideto
搜索本博客
我的相册
A6bdc31c-c66e-468e-961e-9cc721e82adc-thumb
screenshot
共 1 张
存档
最新评论