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

时间:2015-06-01 18:36:05

标签: ruby-on-rails oop rspec

我的一个模型中有一个方法可以返回将被输入图表宝石的数据。

class MyModel < ActiveRecord::Base
  def ownership_data
        format_data(item_ownerships.group(:owned).count)
  end
end

我需要保证数据返回在结果中总是有2个值。像这样:

{“是”=&gt; 4,“不”=&gt; 2}

为了做到这一点,我编写了第一种方法中使用的另一种方法:

def format_data(values)
   values[false].nil? ? values = values.merge({ "no" => 0 }) : true
   values[true].nil? ? values = values.merge({ "yes" => 0 }) : true

   return values
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

我不太高兴必须实例化模型的实例来测试它。任何指导都表示赞赏。

1 个答案:

答案 0 :(得分:2)

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

如果您的对象不一定取决于模型本身,则应考虑将其移至plain old ruby objectservice object。这些可以存在于单独的文件夹(lib / services)或模型文件夹中,而不继承自ActiveRecord::Base

您的方法也可以是类方法def self.method_name(values, values_2)而不是实例方法(如果您不需要模型中的特定值)。

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