在Ruby测试中验证大型哈希的有效方法

时间:2012-10-09 22:46:12

标签: ruby testing

测试哈希包含特定键和值的有效方法是什么?

有效率我指的是以下项目:

  • 失败时易于阅读
  • 易于阅读的测试来源
  • 最短的测试仍然有效

有时在Ruby中我必须创建一个大哈希。我想学习一种测试这些哈希的有效方法:

expected_hash = {
    :one => 'one',
    :two => 'two',
    :sub_hash1 => {
        :one => 'one',
        :two => 'two'
    },
    :sub_hash2 => {
        :one => 'one',
        :two => 'two'
    }
}

我可以用几种方法测试这个。我使用最多的两种方法是一次完整哈希,或单个项目:

assert_equal expected_hash, my_hash
assert_equal 'one', my_hash[:one]

这些小哈希就像我们的示例哈希一样,但是对于非常大的哈希,这些方法会崩溃。整个哈希测试将显示有关失败的过多信息。单项测试会使我的测试代码太大。

我在想一种有效的方法是将测试分解成许多只验证部分哈希值的小测试。这些较小的测试中的每一个都可以使用整个哈希样式测试。不幸的是,我不知道如何让Ruby为不在子哈希中的项目执行此操作。子哈希可以像下面这样完成:

assert_equal expected_hash[:sub_hash1], my_hash[:sub_hash1]
assert_equal expected_hash[:sub_hash2], my_hash[:sub_hash2]

如何测试哈希的其余部分?

2 个答案:

答案 0 :(得分:1)

测试时,您需要使用可管理的块。正如您所发现的那样,针对巨大的哈希值进行测试会很难跟踪发生的情况。

考虑使用to_a将哈希值转换为数组。然后,您可以轻松地使用集合运算符来比较数组,并找出丢失/更改的内容。

例如:

[1,2] - [2,3]
=> [1]
[2,3] - [1,2]
=> [3]

答案 1 :(得分:0)

您可以在哈希上使用hash方法来比较其中的2个或其部分:

h = {:test => 'test'}
 => {:test=>"test"} 
h1 = {:test => 'test2'}
 => {:test=>"test2"} 
h.hash
 => -1058076452551767024 
h1.hash
 => 1300393442551759555

 h.hash == h1.hash
 => false