Techioz Blog

Rails: RSpec を使用した名前付きスコープのテスト

概要

Rails Web アプリケーションと RSpec をテストするのは初めてです。レガシーコードを使用しているため、テストを追加する必要があります。では、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

「Rail Test Prescriptions」で最良のアプローチ(私見)を見つけました。

should_match_find_method :active_only { :active == true }

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

解決策

RSpec の作成者は最近ブログで、検証は動作であり、関連付けは構造であると考えていると述べています。言い換えれば、彼は関連付け (およびスコープ) は必ずしも直接テストされるべきではないことを発見しました。これらのテストは、必要な動作に従って行われます。

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