Подтвердить что ты не робот

Как я могу проверить rspec для своей области по умолчанию

моя модель имеет default_scope (: order = > 'created_at') мои тесты (rspec, factory girl, shoulda и т.д.) являются:

require 'spec/spec_helper.rb'

describe CatMembership do
  context "is valid" do
    subject { Factory.build(:cat_membership) }
    it { should be_valid }
    it { should belong_to :cat}
    it { should belong_to :cat_group}
    it { should have_db_column(:start_date)}
    it { should have_db_column(:end_date)}
  end
end
4b9b3361

Ответ 1

Я предпочел бы, чтобы это было проверено с помощью запроса и проверки результатов, но если вы действительно это сделаете, одно из возможных решений будет для Rails 3:

CatMembership.scoped.to_sql.should == CatMembership.order(:created_at).to_sql

И на Rails 2:

CatMembership.default_scoping.should == [{:create=>{}, :find=>{:order=>"created_at"}}]

Но я бы не сказал, что эти решения идеальны, поскольку они показывают много знаний о реализации (и вы можете видеть, что реализация зависит от разных версий Rails).

Создание выборочных данных, выполнение обычного запроса all и проверка правильности заказа, возможно, было бы проще, было бы ближе к реальному модульному тестированию и работало бы даже при обновлении версии ваших рельсов.

В этом случае это возможно:

before do
  @memberships = []

  @memberships << CatMembership.create!
  @memberships << CatMembership.create!
  @memberships << CatMembership.create!

  [ 1.hour.ago, 5.minutes.ago, 1.minute.ago ].each_with_index do |time, index|
    membership = @memberships[index]
    membership.created_at = time
    membership.save
  end

end

it 'should be correctly ordered' do
  @sorted_memberships = CatMembership.all
  @memberships.first.should == @sorted_memberships.last
  @memberships.second.should == @sorted_memberships.second
  @memberships.third.should == @sorted_memberships.first
end

Это гораздо более подробный, но он будет работать, даже когда вы двигаетесь вперед по рельсам.

И теперь я только что заметил, кто задал вопрос: D

Ответ 2

DRY It Up, используйте общие примеры

Скорее всего, у вас будет более одной модели с аналогичной областью по умолчанию (если нет, в основном игнорируйте этот метод), поэтому вы можете поместить этот пример Rspec в shared_example, где вы можете назвать его из множества спецификаций модели.

Мой предпочтительный метод проверки области по умолчанию состоит в том, чтобы убедиться, что значение по умолчанию ActiveRecord::Relation имеет ожидаемое предложение (order или where или как бы то ни было):

спецификации/поддержка/shared_examples/default_scope_examples.rb

shared_examples_for 'a default scope ordered by created_at' do

  it 'adds a clause to order by created_at' do
    described_class.scoped.order_clauses.should include("created_at")
  end

end

И затем в вашей спецификации CatMembership (и любой другой спецификации, которая имеет ту же область по умолчанию), все, что вам нужно, это:

спецификации/модели/cat_membership_spec.rb

describe CatMembership

  it_behaves_like 'a default scope ordered by created_at'

  # other spec examples #

end

Наконец, вы можете увидеть, как этот шаблон можно распространять на всевозможные области по умолчанию, и сохраняет чистоту, организованность и, самое главное, DRY.

Ответ 3

В соответствии с последними соглашениями RSpec expect рекомендуется вместо should, поэтому лучшим ответом будет

expect(CatMembership.scoped.to_sql).to eq(CatMembership.order(:created_at).to_sql)

Однако в последнее время Model.scoped устарела, поэтому рекомендуется использовать Model.all вместо

expect(CatMembership.all.to_sql).to eq(CatMembership.order(:created_at).to_sql)