使用Ruby的Struct来存储一个最小的对象

时间:2015-10-21 21:16:01

标签: ruby minitest stub stubbing

这是有效的,但对我来说感觉很草率。我想知道这是代码味道还是有更好的方法来完成这个结果。基本问题是如何在ruby中存根一些任意对象。

我正在测试一个边缘案例 - 解析助手方法的最终值正确格式化谷歌分析查询的结果(因此奇怪的断言声明)传入数据是一个谷歌分析对象,其数据在里面 - 基本上我们必须致电result.data["rows"]。这里结构的整个目的是让我的方法的内部能够发送#data消息。测试通过/失败,但就像我说的那样,我想知道这是否是最好的方法,例如在发送它进行解析之前将数据从GA结果对象中取出。

我的测试方法 - 有效地调用parse_monthly_chart_data(@ga_result)

def test_parse_monthly_chart_data_with_good_values
  typical_data = {"rows" => [["0000", "194346"]...more arrays...]}
  typical_vals = typical_data["rows"].to_h.values.map(&:to_i)
  expected_result = typical_vals[-30..-1].inject(&:+)

  Struct.new("GaResult") {def data; end }
  @ga_result = Struct::GaResult.new
  @ga_result.stub :data, typical_data do
      assert_equal(ga.send(:parse_monthly_chart_data, @ga_result).flatten.last, expected_result)
  end

end

编辑:我已经通过用mocha的实现替换存根来解决部分问题。我还在想这是不是代码味道。

1 个答案:

答案 0 :(得分:3)

完全没有。我一直都在使用这种东西。您正在使用的内容称为存根,使用Struct来完成此操作与使用测试框架的存根实现没什么不同。

further reading on mocks, stubbing, faking, etc. see this SO Question