web-dev-qa-db-ja.com

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」で最善のアプローチ(IMHO)を見つけます。

should_match_find_method :active_only { :active == true }

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

33
andrykonchin

RSpecの作成者は最近、彼が考えているとブログに書いています 検証は動作であり、関連付けは構造です 。言い換えると、関連(およびスコープ)を本質的に直接テストするべきではないことがわかります。これらのテストは、必要な動作から行われます。

つまり、現在の知識では、アプリケーションの動作をテストしてこれらの関連付けをカバーするため、各スコープを直接テストする必要はありません。

31
Joost Baaij

から 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
4
hakunin

最初のアプローチの問題は、実際にデータベースを照会することです。遅くて不要です。よろしければ、最初の方法を安全​​に使用できます。 2番目のアプローチは高速で明確であるため、お勧めします。

0
Jan Minárik