2016-05-10 12 views
0

とCollectionProxyは、私は非常に単純なデータ構造を有しています。私のテストでは、Capybaraminitest-railsmocha(rspecなし)を使用しています。偽造のActiveRecord ::協会::カピバラ(レール)でモカ

FilterActiveRecordのコレクションを適切にスタブするのには苦労しています。これは私が現在持っているものです:Arrayにはpluck()方法が自分ではないので、

require 'test_helper' 

class TestExample < Capybara::Rails::TestCase 

    let(:user) { FactoryGirl.create(:user) } 

    def setup 
     # Create some mock filters: 
     f1 = Filter.new 
     f1.stubs(:id).returns(1) 
     f1.stubs(:user_id).returns(1) 
     f1.stubs(:title).returns("First Filter") 
     f1.stubs(:value).returns(123) 

     f2 = Filter.new 
     f2.stubs(:id).returns(2) 
     f2.stubs(:user_id).returns(1) 
     f2.stubs(:title).returns("Second Filter") 
     f2.stubs(:value).returns(456) 

     fake_filters = [f1, f2] 
     user.stubs(:filters).returns(fake_filters) 

    end 

    def test_user_has_correct_number_of_mocked_filters 
     assert_equal(user.filters.count, 2) 
    end 

    def test_users_mocked_filters_have_correct_ids 
     assert_equal(user.filters.pluck(:id), [1, 2]) # ERROR 
    end 

end 

第二の試験では、エラーがスローされます。

これはどのように達成されますか?私は、実際にはFilterテーブルにレコードがあるかのようにテストを動作させたい。あなたも摘むと呼ばれるfake_filters上のメソッドをスタブない限り

+0

行うようにあなたは彼らがfactory_girl使用して構築する必要がありますので、私はそれを行うための別の方法がなければならない知っています。 –

+0

Capybaraは統合/機能テストのためのものです。Capybara :: Rails :: TestCaseから派生したテストで何かを実際に嘲笑すべきではありません。その目的は実際のDBオブジェクトを含むスタック全体をテストすることです。 –

答えて

1

Capybaraを使用しているときは、完全統合/機能テスト用です。代わりに、ユーザー

factory :user do 
    # you current user factory code 
    # stays here 

    factory :user_with_filters do 
    transient do 
     filters_count 2 
    end 
    after(:create) do |user, proxy| 
     create_list(:filter, proxy.filters_count, user: user) 
    end 
    end 
end 

ためのもので、その後、代わりにlet(:user) { FactoryGirl.create(:user) }のセットアップコードはまったくもないDRYあるlet(:user) { FactoryGirl.create(:user_with_filters) }

+0

良い答えをありがとう。実際のアプリケーションでは、「フィルタ」を作成すると多くのデータを照会するワーカープロセスがトリガされるため、時間がかかります。私はスタブですべてを避けることを望んでいた。しかし、あなたが言うように、統合テストでは実際のDBオブジェクトを使用する必要があります。 –

+0

@BradleyMarquesワーカープロセスの作成を少し切り離して見て、テストを助けるためにフィルターを作成することができます。 –

+0

それは素晴らしい提案です。しましょう。 –

0

Pluckのは、あなたが、

しかしフィルターにやった私はどうなるのかは、ちょうど.map(&:id)の代わり.pluck(:id)を使用しているだけのように、ActiveRecordの::関係に制限する方法であります。 mapとpluckの違いは、pluckの場合はSELECT id FROM filtersの代わりにSELECT * FROM filtersを実行するため、クエリ中にマップが効率的でないことです。また、マップは、アクティブなレコード属性だけでなく、オブジェクトが応答するものを照会することもできます。しかし、ここでは、それはうまくいくはずです。

+0

応答に感謝します。あたかもActiveRecordコレクションのようにテストする必要があります。私のアプリケーションコードでは、他の場所で 'pluck'を使用しています。コレクションが偽装されていれば、失敗します。したがって、TomWalpoleの答えごとに実際のデータベースエントリを使用する方がよいでしょう。 –