使用 Ruby 的 Struct 为 minitest 存根对象
Using Ruby's Struct to stub an object for minitest
这是可行的,但我觉得它很草率。我想知道这是否是一种代码味道,或者是否有更好的方法来实现这个结果。基本问题是如何在 ruby.
中存根一些任意对象
我正在测试一个边缘案例——解析辅助方法的最终值正确地格式化了 google 分析查询的结果(因此是奇怪的断言语句)传入数据是 google 数据在里面的分析对象——本质上我们必须调用 result.data["rows"]
。这里结构的全部目的是让我的方法的内部能够发送该 #data 消息。测试 passes/fails 很合适,但就像我说的,我想知道这是否是最好的方法,例如在发送数据进行解析之前从 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 的实现替换存根解决了这个问题的一部分。我还在想这是不是代码味道。
完全没有。我一直在使用这种类型的东西。您正在使用的称为存根,使用 Struct
来完成此操作与使用测试框架的存根实现没有什么不同。
对于further reading on mocks, stubbing, faking, etc. see this SO Question。
这是可行的,但我觉得它很草率。我想知道这是否是一种代码味道,或者是否有更好的方法来实现这个结果。基本问题是如何在 ruby.
中存根一些任意对象我正在测试一个边缘案例——解析辅助方法的最终值正确地格式化了 google 分析查询的结果(因此是奇怪的断言语句)传入数据是 google 数据在里面的分析对象——本质上我们必须调用 result.data["rows"]
。这里结构的全部目的是让我的方法的内部能够发送该 #data 消息。测试 passes/fails 很合适,但就像我说的,我想知道这是否是最好的方法,例如在发送数据进行解析之前从 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 的实现替换存根解决了这个问题的一部分。我还在想这是不是代码味道。
完全没有。我一直在使用这种类型的东西。您正在使用的称为存根,使用 Struct
来完成此操作与使用测试框架的存根实现没有什么不同。
对于further reading on mocks, stubbing, faking, etc. see this SO Question。