Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 通过各种输入测试函数的正确方式_Ruby_Unit Testing_Rspec_Dsl - Fatal编程技术网

Ruby 通过各种输入测试函数的正确方式

Ruby 通过各种输入测试函数的正确方式,ruby,unit-testing,rspec,dsl,Ruby,Unit Testing,Rspec,Dsl,我需要测试以下行: result = handle(streamOfMessages) 其中消息和上下文是填充良好的散列。我可以这样写it: messages1 = [ {"type"=>"someType1","value"=>"someBigHash1"}, {"type"=>"someType2","value"=>"someBigHash2"}, {"type"=>"someType1","value"=>"someBigHash3"} ] resu

我需要测试以下行:

result = handle(streamOfMessages)
其中
消息
上下文
是填充良好的散列。我可以这样写
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

我可以创建一个数组,并在循环中引用
消息[I]
。然而,在我看来,这一切都是一种非常陈旧的方法,因此我正在寻找一种更鼓舞人心的(甚至应该说是基于DSL的)编程风格。最好有一个更好的语法来构造消息流和在多个流上迭代,同时期望不同的结果。

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

[ {"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)是否有更简单的方法来构造测试集(消息流)?(2) 有没有一种简单的方法来测试它们?单元测试应该是潮湿的(描述性和有意义的短语),而不是干燥的。但是,在这个特定的例子中,它们都不是。@JörgWMittag:在这种情况下,上面的单元测试有什么问题吗?我们欢迎任何建设性的指导方针。在现代,我觉得自己非常“错误”。我可能会编写定制的RSpec匹配器来封装响应和测试逻辑,并为消息提供更多描述性名称。然后,测试变成了类似于
无效的消息。应该被拒绝
@JörgWMittag:谢谢你的“DAMP”,我不知道这个首字母缩写。