ruby-on-rails - spec - ruby unit test




db:test:clone,db:test:clone_structure,db:test:load和db:test:prepare有什麼區別? (2)

它們實際上並不完全相同。 任何包含“schema”一詞的任務都會作用於... / db / schema.rb文件。 schema.rb實際上是應用所有遷移後的架構狀態。 可以執行它來還原您的架構,而不是運行所有的db遷移(如果您有大量遷移,這可能需要很長時間)。

任何帶有“結構”一詞的任務都會作用於{Rails.env} _structure.sql文件。 當架構包含無法在schema.rb文件中表示的構造時,將使用此文件。 例如,如果您使用特定於特定RDBMS的功能。 在幕後,rails使用適合您的RDBMS的任何模式轉儲實用程序生成此文件。 要恢復模式,它將讀取文件並使用特定於RDBMS的工具再次執行SQL語句。

Rails知道是否要根據你是否設置了schema.rb路由或structure.sql路由

config.active_record.schema_format =:sql

在你的... / config / application.rb中

你不得不承認,對於rails和數據庫的新手,rubyonrails.org上的官方解釋使得所有這四個任務聽起來完全一樣。 引用:

rake db:test:clone  Recreate the test database from
                    the current environment’s database schema

rake db:test:clone_structure    Recreate the test database from the
                                development structure

rake db:test:load   Recreate the test database from the current schema.rb

rake db:test:prepare    Check for pending migrations and load the test schema

我甚至不知道結構和架構之間的區別。 加載當前環境的架構和加載schema.rb之間有什麼區別?

這些任務有多相似(或不同)?


非常好的問題。 讓我難過,所以我潛入導軌源並拉起database.rake 。 現在更清楚了:

db:test:clone只是db:schema:dumpdb:test:load

task :clone => %w(db:schema:dump db:test:load)

db:test:clone_structure使用{rails_env} _structure.sql文件:

task :clone_structure => [ 'db:structure:dump', 'db:test:purge' ] do
  # skipped some code, here's what happens for MySQL:
  ActiveRecord::Base.establish_connection(:test)
  # ...
  IO.readlines("#{Rails.root}/db/#{Rails.env}_structure.sql").join.split("\n\n").each do |table|
    ActiveRecord::Base.connection.execute(table)
  end
end

db:test:loaddb:schema:load ,但在測試數據庫上調用它:

task :load => 'db:test:purge' do
  ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])
  # ...
  db_namespace['schema:load'].invoke
end

db:test:prepare如果任何遷移掛起,則db:test:prepare警報,如果沒有,則運行db:test:clone_structure (使用{rails_env} _structure.sql文件)或db:test:load (使用schema.rb文件),取決於架構格式(這對我來說有點困惑,也許其他人可以擴展它):

task :prepare => 'db:abort_if_pending_migrations' do
  # ...
  db_namespace[{ :sql  => 'test:clone_structure', :ruby => 'test:load' }[ActiveRecord::Base.schema_format]].invoke
end

希望這清除它! 再次,通過database.rake文件很容易,並將清除您可能有的任何其他問題。 該鏈接轉到:test命名空間的開頭。





unit-testing