0

私は次のモデルを持っています:

class Kueue < ActiveRecord::Base
    attr_accessible :name, :user_id

    belongs_to :user
    has_and_belongs_to_many :photos

    scope :empty, includes(:photos).where{ photos.id.eq(nil) }
    scope :with_photos, includes(:photos).where{ photos.id.not_eq(nil) }
end

スコープが確実に機能するように、スコープの仕様を記述したいと思います。私の問題は、モデルをどのように扱うかPhotoです。写真には多くの検証があります。たとえば、写真はに属している必要がありますUser。したがって、これらのクエリの実用的な仕様を次のように書くことができます。

describe "queries" do
    before :each do
        @empty = Fabricate(:kueue)
        @full = Kueue.new :name => "Full Queue"
        @full.photos << Fabricate(:photo)
        @full.save
    end

    it "should find empty queues" do
        Kueue.empty.should_not include(@full)
    end

    it "should find queues with photos" do
        Kueue.with_photos.should_not include(@empty)
    end
end

ただし、ご想像のとおり、これは遅いです。これにより、データベースが大量に呼び出されます。(1)2つのキューを作成する、(2)写真を作成する、(3)写真を所有するユーザーを作成する...など。

これは簡単な問題のように思えます。必要なのは、写真とkueueの間の1つの結合レコードだけで、これを非常に高速にテストできます。では、この相互作用をどのようにモックして、より速く、より適切に分離してテストできるようにするのでしょうか。

PS:Rails 3.2.8、Squeel(したがってクエリ構文)を使用しています。QueueはRailsの予約語であるため、モデルはKueueと呼ばれます:)

4

1 に答える 1

2

スコープのコンテキストでモックするのは意味がないと思います。

スコープは基本的にデータベースクエリであり、データベースと連携することを確認する必要があります。

したがって、問題がテストパフォーマンスである場合は、次のことをお勧めします。

  • この場合、器具を試してください

また

  • モデルの検証をスキップして、必要なモデルを減らします
于 2012-11-06T21:46:51.827 に答える