如何比较RSpec中的两个哈希值?

Jam*_*con 9 ruby rspec

我有两个哈希h1h2,我想在RSpec的比较.

我想检查一些转换后的元素h1是否相同h2,我们称之为f.也就是说,我想验证每个键k的位置h1,h1[k] == f(h2[k]).

例如,如果所有值h2都是相应值的两倍h1,那么我想检查kh1中的每个键,h2[k] == h1[k] * 2.

在RSpec中这样做的正确方法是什么?目前我这样做:

h1 = ...
expect(
  h2.all? { |k,v|
    v == f(h1[k])
  }
).to be true
Run Code Online (Sandbox Code Playgroud)

但这似乎很笨拙.

Aar*_*n K 5

听起来你正在测试的是转型.我会考虑写这样的东西:

it "transforming something does something" do
  base_data = { k1: 1, k2: 2 }
  transformed_data = base_data.each_with_object({}) { |(k, v), t|
    t[k] = f(v)
  }

  expect(transformed_data).to eq(
    k1: 2,
    k2: 4,
  )
end
Run Code Online (Sandbox Code Playgroud)

对我来说,描述清楚地说明了我们的期望.然后我可以很容易地从测试中看到输入是什么和预期的输出.此外,这利用了哈希匹配器,它将在失败时为两个哈希提供一个很好的差异:

expected: {:k1=>2, :k2=>4}
     got: {:k1=>1, :k2=>4}

(compared using ==)

Diff:
@@ -1,3 +1,3 @@
-:k1 => 2,
+:k1 => 1,
 :k2 => 4,
Run Code Online (Sandbox Code Playgroud)

虽然我会质疑键值关系的含义.这些只是您试图通过的测试用例吗?如果是这样,我只会让每个人都进行独特的测试.如果有更多的东西,那么我可能会质疑为什么变换方法没有提供哈希开始.