2012-03-19 14 views
1

仕様を少しでも最適化しようとしています。私は通常ネストされたリソースとユーザーのテストデータを作成することに問題があります。私は通常、データを設定する前(:それぞれ)で終わります。これは、私の仕様のうち120以上で実行されます。 A)の動きは:私は私のテストデータ設定RSpec Railsテストデータ

def self.merge(lists) 
    merged_list = lists.first.account.subscriber_lists.build 
    name = "Merge of " 
    lists.each do |list| 
    name << "'#{list.name}', " 
    list.items.each do |item| 
     merged_list.items.build(item.dup.attributes) 
    end 
    end 
    merged_list.name = name.chop.chop 
    merged_list.save! 
    merged_list.reload # I use this to filter out duplicates via validations 
end 

私のオプションを短縮することができない理由はここに(それは正確ではありませんが、あなたはポイントを取得する必要があります)

def setup_test_data 
    @user = FactoryGirl.create(:admin_with_account) 
    @account = @user.account 
    3.times do |n| 
    list = FactoryGirl.create(:list) 
    list.items << FactoryGirl.create_list(:item, 3) 
    @account.lists << list 
    end 
end 

before(:each){setup_test_data} 

subject{List.merge(list1, list2)} 
it{should have(6).items} 

をと:私はあなたをお見せしましょうバックコントローラにいくつかのロジック、アカウントにあまり依存性は、コントローラ B)スタブに保存/もっとたくさんモックが、ネストされたリソース+団体でそれはここに)あなたのアイデアを

Cを行うのは難しい:

おかげ レイ

答えて

0

C)(あなたは、手動でカスタムすくいタスクの後にDBをクリアする必要があります最初のすべてがトランザクション的に実行を確認するためにDatabaseCleanerを使用し、その後、いくつかの基本的なデータをインポートします独自のRSpecののrakeタスクを作成します。なんらかの理由でそれはそうではないようですが、DatabaseCleanerではこれが1ライナーです)。

これは、私がテストする必要のあるあらかじめ定義された大きなデータセットがあり、それを一度作成してからそれに対してトランザクションを実行するようにしたい場合に使用します。

これが魅力的な場合はお知らせください。より多くのコードを提供してお手伝いします。

+0

ありがとう、私はおそらくそれが最善の方法かもしれないと考えました。私はfixture_builderを使用して複数のフィクスチャをセットアップし、次にsetup_dataメソッドをデータベースから取り出します。私はまだ工場出荷時のシーケンスとDatabaseCleanerがどのくらい正確に動作しているか、少し苦労しています。しかし、私は本当にそれを嘲笑してスタブしたくないので、各仕様の統合テストが過去にうまくいってくれました。それはちょうど遅く、いつもきれいなコードで来るとは限りません。 – Ray

+0

質問がありましたらお気軽にお問い合わせください!ファクトリーの女の子はかなり良いドキュメンテーションを持っているので、GitHubページでDatabaseCleanerを実行するので、始めるのに適しています。黙ってスタブすることは、テストが重要であり、繰り返されるテストや「悪い」テストを手短に書くことからあなたを助けることができるので、恥ずかしがり屋ではありません。 – MrDanA