【发布时间】:2019-12-11 11:06:45
【问题描述】:
Rails 上的新手,目前正在学习如何处理类方法、范围和规范... 最初这是作为模型中的作用域编写的,但它看起来有点臃肿,所以我把它拿出来并做成如下的类方法:
class OrderedByIds
scope :for_ids_with_order, lambda { |ids|
order = sanitize_sql_array(
["position((',' || id::text || ',') in ?)", ids.join(',') + ',']
)
where(id: ids).order(order)
}
end
#用法:
OrderedByIds.for_ids_with_order([1, 3, 2])
对此类方法进行单元测试的最佳方法是什么?
【问题讨论】:
-
我不明白你做了什么。这曾经是模型中的一个方法,现在你已经把它移到另一个类中了吗?你希望这如何工作?你能提供更多的上下文吗?根据您提供的有限信息,我认为这没有意义——您可以将该方法移动到 module 中,从而将
included 放入模型中,但我不这样做不知道您希望如何将它用作这样的独立类。 -
您可以像任何其他方法一样对其进行测试。例如,
expect(MyModel.for_ids_with_order).to eq (...)。但同样,如果不了解如何使用此方法的更广泛背景,我不可能编写一个有效的测试用例。 -
“类方法”并不意味着你将一个代码块移动到它自己的类中。这意味着您在类而不是类的实例上定义方法(请参阅method scopes)。为了将类的一部分提取到单独的模块中,Rails 提供了
ActiveSupport::Concern -
@Stefan 最初,这是作用域用法,我如何制作类方法?rubyfiddle.com/riddles/653c0
-
@drifterOcean19 我上面评论中的“方法范围”链接包含一个类方法的示例。你通常只在类体内写
def self.method_name。
标签: ruby-on-rails ruby unit-testing rspec rspec-rails