【问题标题】:Using Ruby's Struct to stub an object for minitest使用 Ruby 的 Struct 为 minitest 存根对象
【发布时间】:2016-01-21 01:05:12
【问题描述】:

这是有效的,但对我来说感觉很草率。我想知道这是否是代码异味,或者是否有更好的方法来实现此结果。基本问题是如何在 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 的实现替换存根解决了这个问题的一部分。我仍然想知道这是否是代码异味。

【问题讨论】:

    标签: ruby minitest stub stubbing


    【解决方案1】:

    一点也不。我一直使用这种类型的东西。您使用的称为存根,使用Struct 来完成此操作与使用测试框架的存根实现没有什么不同。

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

    【讨论】:

    • 谢谢。我想我想知道,因为我必须创建整个假对象,所以它会有一个我可以存根的方法“数据”。我确实喜欢 mocha 的实现,它的行为更像一个 javascript 对象——当我定义我的数据结构时,不需要区分 obj.dataobj.data['rows']。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    相关资源
    最近更新 更多