0

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

我所说的高效是指以下项目:

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

有时在 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]

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

4

2 回答 2

2

测试时,您需要使用可管理的块。正如您所发现的,针对巨大的散列进行测试使得很难跟踪正在发生的事情。

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

例如:

[1,2] - [2,3]
=> [1]
[2,3] - [1,2]
=> [3]
于 2012-10-10T00:30:12.883 回答
0

您可以hash对哈希使用方法来比较其中两个或它们的部分:

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

 h.hash == h1.hash
 => false 
于 2012-10-09T23:13:15.877 回答