在Rails 3中测试示波器的最佳方法是什么。在Rails 2中,我将执行以下操作:

Rspec:

it 'should have a top_level scope' do
  Category.top_level.proxy_options.should == {:conditions => {:parent_id => nil}}
end

这在Rails 3中失败,并带有“[]:ActiveRecord::Relation的未定义方法'proxy_options'”错误。

人们如何测试使用正确选项指定的范围?我看到您可以检查arel对象,并且可能对此有所期望,但是我不确定最好的方法是什么。

最佳答案

撇开“如何测试”的问题...这里是如何在Rails3中实现类似的东西...

在Rails3中,命名作用域的不同之处在于它们仅生成Arel关系运算符。
但是,调查一下!

如果您进入控制台并输入:

# All the guts of arel!
Category.top_level.arel.inspect

您将看到Arel的内部零件。它用于建立关系,但也可以针对当前状态进行内省(introspection)。您会注意到诸如#where_clauses之类的公共(public)方法。

但是,作用域本身具有许多有用的自省(introspection)公共(public)方法,这些方法比直接访问@arel更容易:
# Basic stuff:
=> [:table, :primary_key, :to_sql]

# and these to check-out all parts of your relation:
=> [:includes_values, :eager_load_values, :preload_values,
    :select_values, :group_values, :order_values, :reorder_flag,
    :joins_values, :where_values, :having_values, :limit_value,
    :offset_value, :readonly_value, :create_with_value, :from_value]

# With 'where_values' you can see the whole tree of conditions:
Category.top_level.where_values.first.methods - Object.new.methods
=> [:operator, :operand1, :operand2, :left, :left=,
    :right, :right=, :not, :or, :and, :to_sql, :each]

# You can see each condition to_sql
Category.top_level.where_values.map(&:to_sql)
=> ["`categories`.`parent_id` IS NULL"]

# More to the point, use #where_values_hash to see rails2-like :conditions hash:
Category.top_level.where_values_hash
=> {"parent_id"=>nil}

使用最后一个:#where_values_hash以类似于Rails2中的#proxy_options的方式测试范围。

关于ruby-on-rails - 如何在Rails 3中测试示波器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3025103/

10-10 19:18