2

使用する検索機能のいくつかの Cucumber/webrat 統合テストが必要ですthinking_sphinx & sphinxが、問題は、データがロードされ、通常のキュウリ テスト中にトランザクションでロールバックされるため、thinking_sphinx がインデックスを作成する方法がないことです。または、テストのサブセットだけでトランザクションをオフにする方法はありますか?

この問題は解決しましたか?

[編集 - 検索結果をからかうことを提案しないでください。統合テストで、thinking_sphinx を含むすべての機能の統合をテストしたい]。

4

7 に答える 7

2

このステートメントに問題があることがわかります。

データはロードされ、通常のキュウリ テスト中にトランザクションでロールバックされるため、thinking_sphinx がインデックスを作成する方法はありません。

thinking_sphinx で結果のインデックスを作成するのは高速ではないかもしれませんが、トランザクション内では確実に可能です。これは単一の統合テストであり、(多くの) 単体テストごとに実行されるわけではないため、速度が低下します。

そのため、トランザクション中にインデックスの再作成をトリガーする方法を理解する必要があります。

# somewhere in /features/support:
before('@reindexing') do
  require 'Rake'

  class MyModel
    after_save :force_reindex!

    def force_reindex!
      # in case multiple runs of this block cause the hook
      # to get added multiple times, let's check to make sure
      # we haven't already reindexed for this save
      return if @__reindexed
      Rake["thinking_sphinx:rebuild"].execute
      @__reindexed = true
    end
  end
end

after('@reindexing') do
  class MyModel
    def force_reindex!
      # do nothing; the hook still gets called, but that's ok
    end
  end
end

/features/integration.feature(または何でも)、あなたは持っているでしょう

@reindexing
Feature: The whole shebang, altogether

  Scenario: ...
于 2009-05-27T12:48:26.943 に答える
2

データベース クリーナー プラグインを使用し、features/support/env.rb を次のように変更することで、思考スフィンクスでキュウリ テストを正常に動作させることができました。

# Sets up the Rails environment for Cucumber
ENV["RAILS_ENV"] ||= "cucumber"

...

# http://github.com/bmabey/database_cleaner
require 'database_cleaner'
DatabaseCleaner.strategy = :truncation
Before do
  DatabaseCleaner.clean
end

ThinkingSphinx::Configuration.instance.build
ThinkingSphinx::Configuration.instance.controller.start
at_exit do
  ThinkingSphinx::Configuration.instance.controller.stop
end
ThinkingSphinx.deltas_enabled = true
ThinkingSphinx.updates_enabled = true
ThinkingSphinx.suppress_delta_output = true

# Re-generate the index before each Scenario
Before do
  ThinkingSphinx::Configuration.instance.controller.index
end

ご覧のとおり、'cucumber' 環境と別のデータベースも作成しました (cucumber と spec を競合なく同時に実行するため) - database.yml と sphinx に 'cucumber:' エントリを追加する必要があります。 yml も同様に実行したい場合。

于 2009-06-30T07:29:53.507 に答える
1

Rake タスクは別のプロセスでインデクサーを呼び出し、テスト トランザクションの外部にあるため、リンクされた提案は機能しません。

スフィンクス インデックス プロセスが新しいレコードと更新されたレコードを認識できるように、テスト トランザクションをオフにする以外に、これを回避する方法があるかどうかはわかりません。これを行うには、にTestCase行を追加するだけです

self.use_transactional_fixtures = false

テストの最後にデータの消去を管理する必要があることに注意してください。

于 2009-08-12T15:36:28.943 に答える
0

所有していないコンポーネントをテストすることはお勧めしません。これは、特定のバージョンの sphinx の特定のランキング アルゴリズムに依存し、後で変更され、将来的に予測できない結果が返される可能性があるため、非常に脆弱なテストになります。

ただし、これを行う場合は、mysql アダプターを介してテスト データベースを使用するか、xmlpipe2 オプションを使用して、テスト用に別のインデックスを実行することをお勧めします (xml2pipe を使用すると、sphinx ファイルのインデックス作成オプションを変更しなくてもデータ セットを変更できます)。 . これにはおそらく、テスト データを一度に個別に設定し、(Ruby シェル コマンドを使用して) インデックスを削除してから、インデックスの再作成を強制する (インデックス付けされたドキュメントの総数がデータベース レコードの既知の量と同じになるのを待つ) 必要があります。 )、データに対してテストを実行します。

私が言ったように、インデックスをテストしないように本当に注意します (インデックスを作成しているデータの量に応じて) 常に壊れているテストや遅いテスト ランタイムに対処しなければならないことに気付くかもしれません。

于 2009-05-26T18:30:21.463 に答える
0

これはおそらく価値があるよりも面倒ですが、デルタインデックスをオンにしてみましたか?

于 2009-05-27T11:06:01.190 に答える
0

提案された解決策を試しましたが、sphinx は次のエラーでタイムアウトします。トランザクション フィクスチャが有効になっているときに sphinx のインデックスを再作成することはできないと思います。

エラー: インデックス 'document_core': sql_query_pre[0]: ロック待機タイムアウトを超えました。トランザクションを再開してみてください

于 2009-06-11T02:20:57.820 に答える
0

キュウリのタグを使用してキュウリの思考スフィンクス テストを分離するためにタグを使用する別の例は、こちら.

于 2009-09-04T13:20:36.167 に答える