【问题标题】:The proper style to test a function over a variety of inputs在各种输入上测试函数的正确样式
【发布时间】:2012-10-30 09:48:50
【问题描述】:

我需要测试以下一行:

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)的编程风格。如果有一个更好的语法来构建消息流和迭代多个流同时期望不同的结果,那就太好了。

【问题讨论】:

    标签: ruby unit-testing rspec dsl


    【解决方案1】:

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

    [ {"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) 有没有简单的方法来测试它们?
    【解决方案2】:

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

    【讨论】:

    • 单元测试应该是 DAMP(描述性和有意义的短语),而不是 DRY。但是,在这种特定情况下,它们都不是。
    • @JörgWMittag:那么,上面的单元测试有什么问题?任何建设性的指导方针都将受到欢迎。在现代,我感觉很“错误”。
    • 我可能会编写自定义 RSpec 匹配器来封装响应和测试逻辑,并为消息提供更具描述性的名称。然后,测试变成invalid_message.should be_rejected
    • @JörgWMittag:感谢“DAMP”,我不知道那个缩写词。
    猜你喜欢
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多