Rails3.2.6アプリのconfig/database.ymlにある簡単なRailssqlite3構成例を使用して、開発データベースをリセットし、再シードして、次の手順を実行するだけでテストデータベースを準備していました。
$ rake db:reset
$ rake db:test:prepare
さまざまなデータベースエンジンでTravisCIを使用してRailsアプリケーションをテストすることに関するこのブログエントリを見て、試してみようと思ったので、Homebrew(OSX Snow Leopardを使用しています)を使用してmysqlとpostgresqlをインストールし、セットアップしました指示に従って。関連するgemをインストールし、データベースとTravisファイルを次のように構成しました。brew info
Gemfile
# ...
group :development, :test do
# ...
gem 'sqlite3', '1.3.6'
end
group :test do
# ...
# Test mysql on Travis CI
gem 'mysql2', '0.3.11'
end
group :test, :production do
# ...
# Test postgres on Travis CI and deploy on Heroku
gem 'pg', '0.13.2'
end
config / database.yml
sqlite: &sqlite
adapter: sqlite3
database: db/<%= Rails.env %>.sqlite3
mysql: &mysql
adapter: mysql2
username: root
password:
database: my_app_<%= Rails.env %>
postgresql: &postgresql
adapter: postgresql
username: postgres
password:
database: my_app_<%= Rails.env %>
min_messages: ERROR
defaults: &defaults
pool: 5
timeout: 5000
host: localhost
<<: *<%= ENV['DB'] || "sqlite" %>
development:
<<: *defaults
test: &test
<<: *defaults
production:
<<: *defaults
cucumber:
<<: *test
.travis.yml
language: ruby
rvm:
- 1.9.2
- 1.9.3
env:
- DB=sqlite
- DB=mysql
- DB=postgresql
script:
- RAILS_ENV=test bundle exec rake --trace db:migrate
- bundle exec rake db:test:prepare
- bundle exec rspec spec/
before_script:
- mysql -e 'create database my_app_test'
- psql -c 'create database my_app_test' -U postgres
bundler_args: --binstubs=./bundler_stubs
ただし、を実行するrake db:reset
とCouldn't drop db/development.sqlite3
、開発データベースが正常に作成される前にエラーメッセージが表示されます。したがって、同じデータベース(?)を削除するために複数の呼び出しが行われているようです。トレースされた出力は次のようになります。
$ rake db:reset --trace
** Invoke db:reset (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:reset
** Invoke db:drop (first_time)
** Invoke db:load_config (first_time)
** Invoke rails_env (first_time)
** Execute rails_env
** Execute db:load_config
** Execute db:drop
Couldn't drop db/development.sqlite3 : #<Errno::ENOENT: No such file or directory - my_app/db/development.sqlite3>
** Invoke db:setup (first_time)
** Invoke db:schema:load_if_ruby (first_time)
** Invoke db:create (first_time)
** Invoke db:load_config
** Execute db:create
db/development.sqlite3 already exists
# ...
これは奇妙なことですが、少なくとも開発データベースが作成され、シードされます。実行すると、実際の問題がrake db:test:prepare
発生します。エラーメッセージはなく、テストデータベースは作成されていませんが、開発データベースのデータは吹き飛ばされます(スキーマはそのままです)。コマンドのRails環境を直接指定してみたところ、次のようになりました。
$ rake db:test:prepare RAILS_ENV=test
You have 7 pending migrations:
20120503193649 CreateUsers
# ...
Run `rake db:migrate` to update your database then try again.
を実行した後rake db:migrate RAILS_ENV=test
、rspecテストを再度実行できました。そのため、同じ結果を得るための私のrakeコマンドは次のように変更されました。
$ rake db:reset # (with an error)
$ rake db:migrate RAILS_ENV=test
config / database.ymlファイル を単純なsqlite3のみの構成に戻し、期待どおり db:reset
に db:test:prepare
機能する場合。
それで、これは私のmysqlおよび/またはpostgres設定がrakeタスクを繰り返す原因になっている、および/またはそれらがRails環境設定を台無しにしていることを意味しますか?私の環境がこれらの3つのデータベースエンジンで正しく動作するように実際に設定されているかどうかを確認するには、どこを探す必要がありますか?
編集
Rails 3.2.8.rc2のリリースノートを見ると、ActiveRecord
この質問に関連する可能性のある変更が見つかりました。
- および関連するレーキタスクを使用する場合
RAILS_ENV
は、に設定しないでください。これにより、RSpecを使用するときに開発データベースデータが切り捨てられていました。RC2で使用時に再度修正されましたdevelopment
db:test:prepare
config.active_record.schema_format = :sql
config/application.rbには次の説明があります。
# Use SQL instead of Active Record's schema dumper when creating the database.
# This is necessary if your schema can't be completely dumped by the schema dumper,
# like if you have constraints or database-specific column types
# config.active_record.schema_format = :sql
私のスキーマには制約やデータベース固有の列タイプがないため、この行のコメントを解除しませんでしたが、リリースノートの内容を考えると、RAILS_ENV
デフォルトdevelopment
で開発環境で削除されたデータの原因となる可能性があると考えました。それで、私はいくつかのことを試し、以前に行ったことを実行することで期待される結果を得ました(Railsを3.2.8.rc2にアップグレードした後):
$ rake db:reset # (with an error)
$ rake db:test:prepare RAILS_ENV=test # (with no "pending migrations" issue)
これは少し良いですが、まだエラーがあるので私には間違っているように見えます。テストデータベース用に特別に調整されたrakeコマンドを実行するときrake db:reset
に設定する必要があるのは意味がありません。RAILS_ENV=test
アップデート
Rails 3.2.9にアップグレードすると、次の修正によりこの問題が解決するようです。
rake db:test:prepare
structure.sqlを開発データベースにロードしようとするバグを修正します。修正#8032。
GraceLiu+RafaelMendonçaFrança
これで、開発データベースを再度リセットして再シードし、次の手順を実行するだけでテストデータベースを準備できます。
$ rake db:reset
$ rake db:test:prepare