私はテストに不慣れです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」で最善のアプローチ(IMHO)を見つけます。
should_match_find_method :active_only { :active == true }
どこ should_match_find_method
カスタムヘルパーメソッド
RSpecの作成者は最近、彼が考えているとブログに書いています 検証は動作であり、関連付けは構造です 。言い換えると、関連(およびスコープ)を本質的に直接テストするべきではないことがわかります。これらのテストは、必要な動作から行われます。
つまり、現在の知識では、アプリケーションの動作をテストしてこれらの関連付けをカバーするため、各スコープを直接テストする必要はありません。
から https://coderwall.com/p/hc8ofa/testing-Rails-model-default_scope-with-rspec
例:
class Trip < ActiveRecord::Base
default_scope { order(departure: :asc) }
...
end
RSpec.describe Trip, type: :model do
it "applies a default scope to collections by departure ascending" do
expect(Trip.all.to_sql).to eq Trip.all.order(departure: :asc).to_sql
end
end
最初のアプローチの問題は、実際にデータベースを照会することです。遅くて不要です。よろしければ、最初の方法を安全に使用できます。 2番目のアプローチは高速で明確であるため、お勧めします。