1

使用しているレガシーデータベースが原因で、MyISAMを使用しているMySQLでスタックしています。つまり、テーブルはトランザクションをサポートしていません。テストによって生成されたテーブルデータ(フィクスチャにfactory_girlを使用しています)はシナリオごとに戻されないため、これによりテストが失敗します。

Rspecがspec_helper.rbの構成設定を公開していることを発見しconfig.use_transactional_fixturesました。

これはデフォルトでtrueに設定されています。falseに設定すると、テストへの影響は見られません。レコードが重複しているため、まだ失敗します。

その設定は、DBに加えられた変更を自動的に展開することになっているのではないですか?それとも私はそれを手動で行うことになっていますか?

4

1 に答える 1

1

正解です。データベースがトランザクションをサポートしていない場合は、各ステートメントの前にデータを消去するためにいくつかのSQLコマンドを発行する必要があります。

TRUNCATE TABLE tablename;

テーブルごとに1つ。

helper.rbでこれを試してください:

Spec::Runner.configure do |config|
  config.before(:each) do
    tables = %{users posts tags}
    tables.each do |t|
      ActiveRecord::Base.connection.execute('TRUNCATE TABLE #{t}')
    end
  end
  ... 
end 
于 2011-01-05T07:52:40.357 に答える