1

最近、データベースに問題が発生しています。最初は factorygirl の問題だと思っていましたが、factorygirl は (おそらく) クリアされていないデータを実際には使用していないことに気付きました。

とにかく、最初に factorygirl を使用して新しいユーザーを作成します。次に、ユーザーとしてログインし、データ フィールド「foo_name」と「bar」を持つ新しい「foo」を作成できるページに移動します。次に「」を記入します。:with => "" フィールドと click_button "保存" をクリックして、新しい "foo" オブジェクトを作成します。その後、新しいオブジェクトのインデックスを確認すると、1 のはずですが、テストを実行するたびに数字が 4 ずつ増えていきます (現在は 72 です)。

さらに、テストの開始時に古いユーザーを削除する必要があることがわかりました。そうしないと、factorygirl はユーザーが既に作成されていると文句を言います。

RSPEC がテスト データベースの削除を処理してくれるはずだとほぼ確信していましたが、間違っていますか? もしそうなら、データベースをクリアする「良い」方法について誰か良いアドバイスがありますか? 私はすでに数日間見回してきましたが、これまでのところ本当に残念です。

どうもありがとうございました。

編集(いくつかのサンプルコードがリクエストされました):

...
  context "can create a new FooBar" do
    before {
      find_link('New Foo Bar').click
    }
    it 'has current_path "/foo_bar/new"' do
      current_path.should == '/foo_bar/new'
    end
    context "when the correct information is given" do
      before {
        fill_in 'Name', :with => 'TestFooBar'
        fill_in 'Description', :with => 'A test foo bar'
        click_button 'Save'
      }
      it 'has current_path "/foo_bars"' do
        current_path.should == '/foo_bars'
      end
...

この後、foo_barsがいくつあるかを確認します

4

2 に答える 2

3

将来これを必要とする人のために、この問題は解決されました。Zetetic が言ったように、トランザクション フィクスチャで Capybara を使用することはできません。

この問題を解決するために、Database Cleaner を使用しました。

gem インストール database_cleaner

Gemfile:
group :test do
  gem 'database_cleaner'
end

バンドル インストール

スペック/spec_helper.rb:

config.use_transactional_fixtures = false
...
module ::RSpec::Code
  class ExampleGroup
    include Capybara::DSL
    include Capybara::RSpecMatchers
  end
end

foo_bar ファイル:

before(:all) {
  ...
  DatabaseCleaner.strategy = :truncation
}
after(:all) {
  ...
  DatabaseCleaner.clean
  Capybara.reset_sessions!
  Capybara.use_default_driver
}
于 2012-07-10T19:00:56.837 に答える
1

仕様は、最初の行が ID==1 で作成されるという仮定に依存するべきではありません。

テストデータベースのクリーンアウトに関しては、通常、RSpec はトランザクションで各スペックを実行し、例が完了すると変更をロールバックすることでこれを処理します。これは、構成に次の行がある場合に発生します。

config.use_transactional_fixtures = true

これを false に設定する必要がある場合は、Database Cleanerなどのツールを使用して、各例の後にデータベースをクリアできます。

于 2012-07-09T23:00:29.010 に答える