是否有任何规范期望通过排除指定的键来比较两个哈希值。
H1 = {'name' => 'XXXXx', 'age' => 29, 'DOB' => 'dd/mm/yyyy'} H2 = {'name' => 'XXXXX', 'age' => 29, 'DOB' => 'dd/mm/yyyy'}
通过单独排除DOB键来比较上述两个哈希值。
lskq00tm1#
我不明白你为什么需要这样,但你可以使用Hash#delete_if
Hash#delete_if
RSpec.describe do let(:hash1) { {'name' => 'XXXXX', 'age' => 29, 'DOB' => 'dd/mm/yyyy'} } let(:hash2) { {'name' => 'XXXXX', 'age' => 29, 'DOB' => 'dd/mm/yyyy'} } it 'should correctly compare two subhashes' do expect(hash1.delete_if { |k,_| k == 'DOB' }).to eql(hash2.delete_if { |k,_| k == 'DOB' }) end end
如果你想让你的expect更整洁,你可以在之前转换哈希值。也可以使用Hash#reject
expect
Hash#reject
RSpec.describe do it 'should correctly compare two subhashes' do hash1 = {'name' => 'XXXXX', 'age' => 29, 'DOB' => 'dd/mm/yyyy'} hash2 = {'name' => 'XXXXX', 'age' => 29, 'DOB' => 'dd/mm/yyyy'} hash1, hash2 = [hash1, hash2].map { |h| h.reject { |k,_| k == 'DOB' } } expect(hash1).to eql(hash2) end end
aamkag612#
我们可以比较两个临时散列,它们的值相同,但键'DOB'(如果存在)被删除,而不是比较两个临时散列,它们的值分别等于H1和H2。该值是任意的;我用nil。
'DOB'
H1
H2
nil
expect(H1.merge('DOB'=>nil).to eq(H2.merge('DOB'=>nil)))
另一种方法是:
expect((H1.keys|H2.keys).all? do |k| k=='DOB' || (H1.key?(k) && H2.key?(k) && H1[k]==H2[k]) end.to eq(true)
H1.key?(k) && H2.key?(k)在其中一个哈希值的关键字k的值为nil,而另一个哈希值没有关键字k。这有一个可取之处,它比我上面提到的两种方法对内存的需求更小。
H1.key?(k) && H2.key?(k)
k
2条答案
按热度按时间lskq00tm1#
我不明白你为什么需要这样,但你可以使用
Hash#delete_if
如果你想让你的
expect
更整洁,你可以在之前转换哈希值。也可以使用
Hash#reject
aamkag612#
我们可以比较两个临时散列,它们的值相同,但键
'DOB'
(如果存在)被删除,而不是比较两个临时散列,它们的值分别等于H1
和H2
。该值是任意的;我用nil
。另一种方法是:
H1.key?(k) && H2.key?(k)
在其中一个哈希值的关键字k
的值为nil
,而另一个哈希值没有关键字k
。这有一个可取之处,它比我上面提到的两种方法对内存的需求更小。