我有两个哈希h1和h2,我想在RSpec中进行比较.
我想检查一些转换后h1的元素与h2相同,我们称之为f.也就是说,我想验证对于h1中的每个密钥k,h1 [k] == f(h2 [k]).
例如,如果h2中的所有值都是h1中相应值的两倍,那么我想检查h1中的每个键k,h2 [k] == h1 [k] * 2.
在RSpec中这样做的正确方法是什么?目前我这样做:
h1 = ... expect( h2.all? { |k,v| v == f(h1[k]) } ).to be true
但这似乎很笨拙.
解决方法
听起来你正在测试的是转型.我会考虑写这样的东西:
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
对我来说,描述清楚地说明了我们的期望.然后我可以很容易地从测试中看到输入是什么和预期的输出.此外,这利用了哈希匹配器,它将在失败时为两个哈希提供一个很好的差异:
expected: {:k1=>2,:k2=>4} got: {:k1=>1,:k2=>4} (compared using ==) Diff: @@ -1,3 +1,3 @@ -:k1 => 2,+:k1 => 1,:k2 => 4,
虽然我会质疑键值关系的含义.这些只是您试图通过的测试用例吗?如果是这样,我会让每个人都进行独特的测试.如果还有更多内容,那么我可能会质疑为什么变换方法没有提供哈希开始.