我怎样才能对我的默认范围进行rspec测试

Mic*_*ant 18 ruby testing scope rspec default-scope

我的模型有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
Run Code Online (Sandbox Code Playgroud)

Mau*_*res 29

我宁愿使用查询并检查结果进行测试,但如果你真的必须这样做,一个可能的解决方案就是这样的Rails 3:

CatMembership.scoped.to_sql.should == CatMembership.order(:created_at).to_sql
Run Code Online (Sandbox Code Playgroud)

在Rails 2上:

CatMembership.default_scoping.should == [{:create=>{}, :find=>{:order=>"created_at"}}]
Run Code Online (Sandbox Code Playgroud)

但我不会说这些解决方案是理想的,因为它们显示了很多实现知识(你可以看到实现因Rails版本的不同而不同).

创建样本数据,运行通常的所有查询并检查结果是否正确排序可能更简单,更接近真实的单元测试,即使在升级rails版本时也能正常工作.

在这种情况下,它可能是:

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
Run Code Online (Sandbox Code Playgroud)

它更加冗长,但即使你在轨道上前进,它也会起作用.

现在我刚刚注意到谁问了这个问题:D