我的一个模型中有一个方法可以返回将被输入图表宝石的数据。
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
我不太高兴必须实例化模型的实例来测试它。任何指导都表示赞赏。
答案 0 :(得分:2)
正如AJ在评论中提到的,我们可能需要更多信息来继续提供更具体的建议。无论如何,我会给一些......
如果您的对象不一定取决于模型本身,则应考虑将其移至plain old ruby object或service object。这些可以存在于单独的文件夹(lib / services)或模型文件夹中,而不继承自ActiveRecord::Base
。
您的方法也可以是类方法def self.method_name(values, values_2)
而不是实例方法(如果您不需要模型中的特定值)。
当涉及到我的项目报告的数据操作时,我为“lib / reports”下的那些人构建了特定的ruby服务对象文件夹,他们获取原始数据(通常是在init方法中)并从中返回格式化数据方法调用(如果可以在不同的输出选项中格式化相同的数据,则允许我进行多次调用)。这使它们与模型分离。此外,这使得测试变得容易(传递Class.new
中的已知值期望方法输出中的特定值。