5

モデル「SoftwareVersion」のフィクスチャがあります:

testing:
  id: 4
  version: "4.0"
  file_name: MyString4
  is_testing: true

モデルのデフォルトのスコープ:

 default_scope where(is_testing: false)

テストでこれを行う場合:

software_versions(:testing)

エラーが発生します:

ActiveRecord::RecordNotFound: Couldn't find SoftwareVersion with id=4 [WHERE `software_versions`.`is_testing` = 0]

それは意図した動作ですか?そして、どうすればそれを上書きできますか?

4

2 に答える 2

3

はい、これは意図された動作です。デフォルトのスコープはすべてのクエリに影響します。unscoped を使用して、クリーンなクエリを再度開始します。

SoftwareVersion.unscoped.where(is_testing: true)
SoftwareVersion.unscoped.find(id: 4)
etc.

しかし、それとは別に、Production レコードと Testing レコードの両方を格納するために (フィクスチャを使用して) 同じテーブルを使用している場合、それは間違っています。Rails はテスト用にまったく異なるデータベースを使用するため、区別するための列は必要ありません。また、フィクスチャを の下test/fixturesに置くと、本番環境ではまったくロードされません。

于 2014-11-11T15:09:07.403 に答える
2

動作は意図したとおりです。唯一の問題は、テスト データベースに SoftwareVersion の記録がないことです。テストを実行する前に、データベースにデータを入力するだけで済みます。ご覧のとおり、クエリは完全に実行され、 のようWHERE software_versions.is_testing = 0にゼロ手段で実行falseされますdefault_scope

于 2013-07-29T12:32:09.397 に答える