在各种输入上测试函数的正确样式

时间:2012-10-30 09:48:51

标签: ruby unit-testing rspec dsl

我需要测试以下一行:

result = handle(streamOfMessages)

其中messagescontext是人口稠密的哈希值。我可以这样写it

messages1 = [ {"type"=>"someType1","value"=>"someBigHash1"}, {"type"=>"someType2","value"=>"someBigHash2"}, {"type"=>"someType1","value"=>"someBigHash3"} ]
result1 = handle(messages1)
result1.should == [someValue1, someOtherValue1]

messages2 = [ {"type"=>"someType1","value"=>"someBigHash1"}, {"type"=>"someType2","value"=>"someBigHash2"}, {"type"=>"someType1","value"=>"someBigHash3"} ]
result2 = handle(messages1)
result2.should == [someValue2, someOtherValue2]

// same about messages3, result3 etc

我可以创建一个数组数组并在循环中引用messages[i]。然而,这一切在我看来都是一种非常古老的方法,因此我正在寻找一种更具启发性(甚至应该说基于DSL 的)编程风格。在构造消息流和迭代多个流的同时期望不同的结果时,有一个更好的语法会很棒。

2 个答案:

答案 0 :(得分:0)

您可以为每个输入动态生成单独的测试用例:

[ {"type"=>"someType1","value"=>"someBigHash1"}, {"type"=>"someType2","value"=>"someBigHash2"}, {"type"=>"someType1","value"=>"someBigHash3"} ].each do |h|
  it "should handle #{h[:type]} to return #{h[:value]}" do
     result1 = handle(h)
     result1.should == [value1, value2]
  end
end

value1和value2未在此处设置,但我希望您明白这一点 - 您也可以将它们插入到哈希数组中并与它们进行比较。

答案 1 :(得分:0)

我不会以任何重要方式重写规范。在我看来,单元测试不应该包含“聪明”的代码,它们不应该被重构和干扰,这是荒谬的。你想要的唯一一件事就是看一段代码是否为给定的输入产生了正确的输出。你的代码已经实现了......