Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 方法应该去哪里(模型?,其他地方)_Ruby On Rails_Oop_Rspec - Fatal编程技术网

Ruby on rails 方法应该去哪里(模型?,其他地方)

Ruby on rails 方法应该去哪里(模型?,其他地方),ruby-on-rails,oop,rspec,Ruby On Rails,Oop,Rspec,在我的一个模型中,我有一个方法,它返回数据,这些数据将被输入到图表中 class MyModel < ActiveRecord::Base def ownership_data format_data(item_ownerships.group(:owned).count) end end 我的问题是,这个方法应该放在哪里,如何使用rspec进行单元测试?我目前已经在模型中得到了它,但是在尝试用rspec测试它时,我的规格如下所示: let(:values) {

在我的一个模型中,我有一个方法,它返回数据,这些数据将被输入到图表中

class MyModel < ActiveRecord::Base
  def ownership_data
        format_data(item_ownerships.group(:owned).count)
  end
end
我的问题是,这个方法应该放在哪里,如何使用rspec进行单元测试?我目前已经在模型中得到了它,但是在尝试用rspec测试它时,我的规格如下所示:

let(:values) { { "yes" =>2 } }

it "it will return 2 values" do
    result = MyModel.new.format_data(values)
    expect(result.keys.count).to eq(2)
end

我对必须实例化模型实例来测试这一点不太满意。感谢您的指导。

正如AJ在评论中提到的,我们可能需要更多信息来提供更具体的建议。无论如何我会给你一些

如果你有一个不一定依赖于模型本身的对象,你应该考虑把它移到A或A。它们可以位于单独的文件夹(lib/services)或模型文件夹中,而无需从

ActiveRecord::Base
继承

您的方法也可以是类方法
def self.method\u name(values,values\u 2)
,而不是实例方法(如果您不需要模型中的特定值)


当涉及到为我的项目报告的数据操作时,我为“lib/reports”下的对象构建了特定的ruby服务对象文件夹,它们获取原始数据(通常在init方法中)并从方法调用返回格式化数据(如果相同的数据可以在不同的输出选项中格式化,则允许我进行多次调用)。这使得它们与模型分离。而且,这使得测试变得容易(在
类中传入已知值。新的
在方法输出中预期特定值。

您对这个问题的泛化太多了,很难说方法的用途是什么。您可能正在输入JavaScript库、API或视图。这将通知您可以将方法放在何处。我要说的是AModel。新的是一个非常复杂的问题要调用“廉价”方法,它不会查询或保存到数据库,因此实例化它不会有很大的开销。该方法所做的是获取ActiveRecord查询项的结果\u ownerships.group(:owners.count),如果其中只有一个值(仅“是”或“否”),向其添加第二个值,使其始终包含“是”和“否”的值"。它严格地处理activerecord查询的结果。为什么您对必须实例化一个模型来测试模型方法感到不高兴?在任何情况下,都可以说此方法属于装饰器、演示器或简单的实用程序类。该方法基本上是一个实用程序,用于获取查询提供的数据,并对其进行较大的处理,以使其能够对其他东西来说是可以理解的。只是实例化一个模型类来测试它感觉不对。仅此而已。
let(:values) { { "yes" =>2 } }

it "it will return 2 values" do
    result = MyModel.new.format_data(values)
    expect(result.keys.count).to eq(2)
end