同じレコードをクエリするときにActiveRecordが異なるrubyオブジェクトを作成するのはなぜですか?

istrasci

FactoryBotを使用してRSpecでRailsモデルの名前付きスコープをテストしようとしています。複数のレコードを作成していますが、スコープから返されるのは1つだけです。

RSpec.describe GemNamespace::GemModel, type: :model do

  before(:all)
    FactoryBot.create(:gem_model, :trait1)  # id 1
    FactoryBot.create(:gem_model, :trait2)  # id 2
    FactoryBot.create(:gem_model, :trait3)  # id 3
  end

  let(:included_record) { GemNamespace::GemModel.find 1 }

  describe 'my_named_scope' do
    it 'returns only records matching the conditions' do
      scope_results = GemNamespace::GemModel.my_named_scope
      expect(scope_results).to contain_exactly(included_record)
    end
  end

end

included_record唯一のレコードであるにもかかわらずscope_results、一部のデバッグではincluded_record、何らかの理由で結果のRubyオブジェクトとは実際には異なるRubyオブジェクトであること示されているため、テストは失敗しています。したがって、contain_exactlyは失敗します。

私はこのようなスコープテストを多数のモデルで実行しましたが、常に機能しています。これとの唯一の違いは、モデルがgem内で定義されていることと、Railsアプリで名前付きスコープをモデルに追加することでその機能を拡張していることです。

何が足りないのですか?このモデルだけでこのように動作するのはなぜですか?

重要な場合:

  • Ruby 2.5.0
  • Rails 5.1.5
  • rspec 3.7.0
  • rspec-rails 3.7.2
  • factory_bot(_rails)4.8.2

更新:上記を編集する代わりに、これをここに配置します。私は実際にテーブルではなくデータベースビューをテストしています。ビューには一意のID列がないため、実際にはGemNamespace::GemModel.find 1上記を実行していませんが、代わりにwhere(column: <condition value>)

istrasci

私は回避策でこれを解決しました。Railsの内部についてはあまりよくわかりませんが、データベースビュー(および対応するモデル)にid列がないため、問題が発生しているようです(つまり、個別のRubyオブジェクトが作成されています)。したがって、2つのオブジェクトのすべての値を「手動で」比較しただけです。

# As a workaround, we're just gonna convert them both to Ruby hashes using
# the #as_json method, and compare those instead.

expect(scope_results.as_json).to contain_exactly(included_record.as_json)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

異なるオブジェクトを渡すと、AJAXが同じデータをコールバックに返すのはなぜですか?

分類Dev

GetDCが同じオブジェクトに対して異なる値を返すのはなぜですか?

分類Dev

hashcode()がオブジェクトのアドレスに基づいてハッシュコードを作成する場合、同じ内容の2つの異なるオブジェクトが同じハッシュコードを作成するにはどうすればよいですか?

分類Dev

ループで作成するオブジェクトが同じになるのはなぜですか?

分類Dev

同じ値の異なる変数が異なるオブジェクトを指すようにすることはできますか?

分類Dev

特性とオブジェクトの名前を同じにする必要があるのはなぜですか。

分類Dev

2つの異なるオブジェクトを同じオブジェクトにデコードするのに、boolメンバーが変更されていないのはなぜですか?

分類Dev

「new」演算子を使用せずに作成されたオブジェクトが同じアドレスを取得するのはなぜですか

分類Dev

異なる参照で同じオブジェクトのコピーを作成する方法は?

分類Dev

新しいオブジェクトをポイントした後、メモリアドレスが同じになるのはなぜですか?

分類Dev

同じオブジェクトの異なるメソッドが同じ `id`を持っているのはなぜですか?

分類Dev

値が異なる同じクラスオブジェクトがデータソースとして渡されたときに、ビューが再レンダリングされないのはなぜですか

分類Dev

値が異なる同じクラスオブジェクトがデータソースとして渡されたときに、ビューが再レンダリングされないのはなぜですか

分類Dev

異なるオブジェクトに同じ値が割り当てられるのはなぜですか?

分類Dev

static_castが同じオブジェクトに異なるメモリ位置を与えるのはなぜですか?

分類Dev

コンパレータオブジェクトをsortメソッドに渡すことができるのはなぜですか?

分類Dev

オブジェクトを含む同じコードが機能するのに、オブジェクトを含むコードがコンパイルに失敗するのはなぜですか?

分類Dev

異なるスレッドで同じオブジェクトの同じメソッドを同時に実行できますか?

分類Dev

リクエストURLが同じでCompletableFutureで処理されるのに、Tomcatが異なるスレッドを使用するのはなぜですか?

分類Dev

(オブジェクトスコープ外の)変数をオブジェクトメソッドと同じに設定すると、未定義の結果が返されるのはなぜですか?

分類Dev

2つの異なるストリームに書き込まれた単一のオブジェクトが、読み返されたときに2つの異なるオブジェクトを表すのはなぜですか?

分類Dev

Spring Bootが異なるリクエストに対して同じHttpServletResponseオブジェクトをControllerメソッドに注入するのはなぜですか?

分類Dev

なぜPythonは外部スコープから「リスト」オブジェクトを読み取ることができるのに、「int」オブジェクトに対して「割り当て前に参照」エラーが発生するのですか?

分類Dev

同じオブジェクトを指す2つのオブジェクトインスタンスの1つが、それらのいずれかにNULLを割り当てると、異なる動作をするのはなぜですか?

分類Dev

同じオブジェクトの別のプロパティから、オブジェクトの1つのプロパティでjQueryセレクターを参照すると、エラーがスローされるのはなぜですか?

分類Dev

オブジェクトを別のオブジェクトにコピーするときに、C ++が両方のオブジェクトに低レベルのconst修飾を必要とするのはなぜですか?

分類Dev

異なるJSオブジェクトのmyメソッドが同じ結果を生成するのはなぜですか?

分類Dev

異なるスレッドでオブジェクトを使用しても安全ですが、同時に使用することはできませんか?

分類Dev

異なるスレッドでオブジェクトを使用しても安全ですが、同時に使用することはできませんか?

Related 関連記事

  1. 1

    異なるオブジェクトを渡すと、AJAXが同じデータをコールバックに返すのはなぜですか?

  2. 2

    GetDCが同じオブジェクトに対して異なる値を返すのはなぜですか?

  3. 3

    hashcode()がオブジェクトのアドレスに基づいてハッシュコードを作成する場合、同じ内容の2つの異なるオブジェクトが同じハッシュコードを作成するにはどうすればよいですか?

  4. 4

    ループで作成するオブジェクトが同じになるのはなぜですか?

  5. 5

    同じ値の異なる変数が異なるオブジェクトを指すようにすることはできますか?

  6. 6

    特性とオブジェクトの名前を同じにする必要があるのはなぜですか。

  7. 7

    2つの異なるオブジェクトを同じオブジェクトにデコードするのに、boolメンバーが変更されていないのはなぜですか?

  8. 8

    「new」演算子を使用せずに作成されたオブジェクトが同じアドレスを取得するのはなぜですか

  9. 9

    異なる参照で同じオブジェクトのコピーを作成する方法は?

  10. 10

    新しいオブジェクトをポイントした後、メモリアドレスが同じになるのはなぜですか?

  11. 11

    同じオブジェクトの異なるメソッドが同じ `id`を持っているのはなぜですか?

  12. 12

    値が異なる同じクラスオブジェクトがデータソースとして渡されたときに、ビューが再レンダリングされないのはなぜですか

  13. 13

    値が異なる同じクラスオブジェクトがデータソースとして渡されたときに、ビューが再レンダリングされないのはなぜですか

  14. 14

    異なるオブジェクトに同じ値が割り当てられるのはなぜですか?

  15. 15

    static_castが同じオブジェクトに異なるメモリ位置を与えるのはなぜですか?

  16. 16

    コンパレータオブジェクトをsortメソッドに渡すことができるのはなぜですか?

  17. 17

    オブジェクトを含む同じコードが機能するのに、オブジェクトを含むコードがコンパイルに失敗するのはなぜですか?

  18. 18

    異なるスレッドで同じオブジェクトの同じメソッドを同時に実行できますか?

  19. 19

    リクエストURLが同じでCompletableFutureで処理されるのに、Tomcatが異なるスレッドを使用するのはなぜですか?

  20. 20

    (オブジェクトスコープ外の)変数をオブジェクトメソッドと同じに設定すると、未定義の結果が返されるのはなぜですか?

  21. 21

    2つの異なるストリームに書き込まれた単一のオブジェクトが、読み返されたときに2つの異なるオブジェクトを表すのはなぜですか?

  22. 22

    Spring Bootが異なるリクエストに対して同じHttpServletResponseオブジェクトをControllerメソッドに注入するのはなぜですか?

  23. 23

    なぜPythonは外部スコープから「リスト」オブジェクトを読み取ることができるのに、「int」オブジェクトに対して「割り当て前に参照」エラーが発生するのですか?

  24. 24

    同じオブジェクトを指す2つのオブジェクトインスタンスの1つが、それらのいずれかにNULLを割り当てると、異なる動作をするのはなぜですか?

  25. 25

    同じオブジェクトの別のプロパティから、オブジェクトの1つのプロパティでjQueryセレクターを参照すると、エラーがスローされるのはなぜですか?

  26. 26

    オブジェクトを別のオブジェクトにコピーするときに、C ++が両方のオブジェクトに低レベルのconst修飾を必要とするのはなぜですか?

  27. 27

    異なるJSオブジェクトのmyメソッドが同じ結果を生成するのはなぜですか?

  28. 28

    異なるスレッドでオブジェクトを使用しても安全ですが、同時に使用することはできませんか?

  29. 29

    異なるスレッドでオブジェクトを使用しても安全ですが、同時に使用することはできませんか?

ホットタグ

アーカイブ