20

最近、Ruby on Railsアプリケーションをテストするために、フィクスチャからfactory_girlに切り替えました。rake test:unitsを実行して、/ unitsディレクトリでテストを実行すると、すべてが完全に実行されます。rake test:functionalsを使用して(/functionalディレクトリで)機能テストを実行した場合も同じです。

ただし、単にrake testを実行して、ユニットテストと機能テストの両方を一緒に実行すると、2番目のテストグループ(この場合は機能)で検証が失敗し、「検証に失敗しました:名前はすでに取得されています」というメッセージが表示されます。

これは、単体テストで作成されたオブジェクトと同じパラメーターでオブジェクトを作成する機能テストが原因であると思います。単体テストと機能テストの間にテストデータベースがクリアされていないと思います。

私はfactory_girlのシーケンスを使用して、オブジェクトに固有の属性を設定します。つまり、factory_girlはテスト間でリセットされますが、データベースはリセットされません。この問題を解決するにはどうすればよいですか?2つのテストパッケージ間でデータベースをクリアする方法はありますか?

4

6 に答える 6

13

テストデータベースをクリア(再構築)するためのコマンドラインソリューション:

rake db:test:prepare
于 2013-03-17T21:04:37.303 に答える
12

あなたにこれを書いてみてくださいtest/test_helper.rb

eval IO.read(File.expand_path(File.dirname(__FILE__) + "/../Rakefile"))
class Test::Unit::TestCase
 ....
 #db:test:prepare won't work, don't know why,
 #as DROP DATABASE won't execute (me on PostgreSQL).
 #even if I write,
 #ActiveRecord::Base.connection.disconnect!
 Rake::Task["db:reset"].invoke
end

これは推奨される解決策ではありません。テストは遅くなりますが、機能します。

于 2009-07-28T02:32:03.820 に答える
4

「override_rake_task」と呼ばれるRailsプラグインを使用して、Railsgemの内部で定義されているRakeタスク「test」をオーバーライドできます。これは、 test:unitstest:functionalstest:integrationの3つのタスクを次々に実行する非常に単純なタスクです。「db:test:purge」タスクの実行を含めて、test:functionalsを実行する前にテストDBをクリアすることができます。

どうやら、このプラグインを使用しておらず、Railsアプリケーションで同じ名前のタスクを定義した場合、rakeはデフォルトとあなたの両方のタスクを実行します。

于 2009-07-27T16:57:08.377 に答える
2

上記の解決策は私にはうまくいきませんでした。単体テストを実行している外部データベースにアクセスしようとすると、奇妙なエラーが発生する可能性があります。何らかの理由で、テストの実行後にクリアされないためrake db:test:purge、単体テストの実行後に実行する必要があります。これをあなたの中に入れてください、Rakefileそしてそれはそれを修正するはずです。

Rake::Task["db:test:prepare"].enhance do
  Rake::Task["db:test:purge"].invoke
end
于 2009-10-31T04:15:36.917 に答える
1

私は自分のマシンでこの問題に遭遇しました。テスト間でデータベースが適切にリセットされていなかったため、検証の問題が原因でテストが失敗していました。私の状況についてのいくつかの裏話:

-私はLinuxボックスを持っていて、テストに合格する必要があることを知っていたコードを実行していました。
-LionがインストールされたMacを購入し、そのマシンでコードを実行しようとしました。
-ソースからmysqlをインストールしました

すべてが正常にインストールされました。私のデータベースは機能し、railsはそれにアクセスできました。しかし、テストを実行したときに、同じ問題が発生しました。私はこの投稿に出くわし、提案された両方の解決策を試しました(コードの問題ではないように見えましたが、Linuxボックスでrakeが正常に実行されたため、構成の問題のように見えました)。どのソリューションも機能しません。

mysqlを削除しました:

sudo rm / usr / local / mysql
sudo rm -rf / usr / local / mysql *
sudo rm -rf / Library / StartupItems / MySQLCOM
sudo rm -rf / Library / PreferencesPanes / My *
sudo rm -rf / Library / Receipts / mysql *
sudo rm -rf / Library / Receipts / MySQL *
sudo rm /etc/my.cnf
sudo rm / usr / local / bin / mysql *

ソースから手動で行うのではなく、自作でmysqlを再インストールしました(この手順は同僚のアドバイスによるものです)。

export PATH = "/ usr / local / bin:/ usr / local / sbin:/ usr / local / mysql / bin:$ PATH"
brew install https://github.com/adamv/homebrew-alt/raw/master/versions/mysql51.rb
TMPDIRの設定を解除
mysql_install_db

その後、rakeを再実行すると、すべてのテストに合格しました。誰かがLionを使用していて、ソースからmysqlをビルドし、この問題が発生した場合、これが解決策になる可能性があります。

于 2011-10-06T22:21:19.737 に答える
0

DBクリーナーは、特にテスト間のクリーニングに最適な宝石です。すべてのテストをトランザクションでラップしてロールバックする、テーブルを切り捨てる、削除するなど、いくつかのオプションがあります。

また、アクティブレコードを超えて使用していない/使用していない場合に備えて、複数のORMSをサポートします。

ドキュメントは非常に優れており、MiniTest、Rspec、およびCucumberでの使用例が含まれています。

https://github.com/bmabey/database_cleaner

于 2014-06-08T03:13:06.967 に答える