2011-06-26 4 views
25

Rails WebアプリケーションとRSpecを初めてテストしました。私は従来のコードで作業し、テストを追加する必要があります。 RSpecを使ってファインダーと名前付きスコープをテストする最良の方法は何ですか?Rails:RSpecで名前付きスコープをテストする

Googleではいくつかのアプローチがありますが、理想的ではありません。たとえば :

http://paulsturgess.co.uk/articles/show/93-using-rspec-to-test-a-named_scope-in-ruby-on-rails

it "excludes users that are not active" do 
    @user = Factory(:user, :active => false) 
    User.active.should_not include(@user) 
end 

または

http://h1labs.com/notebook/2008/8/21/testing-named-scope-with-rspec

it "should have a published named scope that returns ..." do 
    Post.published.proxy_options.should == {:conditions => {:published => true}} 
end 

私は "鉄道のテスト処方箋" に最善のアプローチ(私見)を見つける:

should_match_find_method :active_only { :active == true } 

should_match_find_methodカスタムヘルパーメソッド

+2

スコープテストは実際に経験的であり、ここで公開する最初の方法に固執します。 – apneadiving

+4

私は同意します。最初のアプローチで何が問題なのですか?おそらく欠陥のある構成パラメータを調べる(実際には書き直す)のではなく、真の動作を指定します。 –

+0

@RobDavis「設定パラメータに問題がある可能性があります」+1 –

答えて

29

RSpecの作成者は、最近彼がValidations are behavior, associations are structureと思うブログを投稿しました。換言すれば、協会(およびスコープ)は直接的に直接検査されるべきではないことが分かっている。これらのテストは、あなたが望むふるまいに従います。

つまり、現在の知恵は、アプリケーションの動作をテストすることでこれらの関連付けをカバーするため、各スコープを直接テストする必要がないということです。

+32

彼はその記事のスコープについて何も言及していませんが、なぜあなたは団体でそれらを盛り上げていますか?スコープは、関連よりもはるかに複雑でエラーが発生しやすく、テストする必要があります。あなたが強大なクリエイター、[ここ](http://groups.google.com/group/rspec/browse_thread/thread/6706c3f2cceef97f)を呼び出したので、スコープが行動の傘の下にある場合(そして、そうでない場合なぜそこにいるのですか?)、それを指定する必要があります。 –

+3

私はスコープがテストされるべきではないと反対していません。彼らは間違いなくすべきです。ただ直接ではありません。スコープのテストは、アプリの動作をテストすることによって行われるべきです。スコープは、結合のような複雑なオプションを持つことができるので、結合と似ています。いずれにせよ、これは私にとって意味をなさないものです。 –

0

第1のアプローチの問題点は、実際にデータベースに問い合わせることです。遅くて不必要です。気にしない場合は、最初の方法を安全​​に使用できます。 2番目のアプローチはすばやく明快ですので、私はそれをお勧めします。

+2

モデル仕様で不要なクエリを実行してもよろしいですか?私はコントローラでそれをやったり、スペックモックを見たり離れたりしないことを理解することができます。しかし、ここでモデルとそのデータベースとの関係をテストしたいと思うでしょう。 – jaydel

+0

IMO名前付きスコープをテストする場合は不要です。実際にデータベースから読み取る他のテストもたくさんあるはずです。 –

+14

スコープは、実際のオブジェクトをフェッチするためにデータベースにクエリするのが確実に意味のある1つの領域です。私はそれが適切なところで嘲笑するのが好きですが、最も単純なスコープだけがモックで動作します。参加またはグループ化を開始すると、それらは分解され、実際のバッキングストアに対してスコープをテストするルールを作成しました。 2番目と3番目の例のような設定ベースのマッチャーはエラーが起こりやすいIMHOです。つまり、コードと同じエラーが発生する可能性が非常に高いです。 –

関連する問題