【问题标题】:rspec expect compare two hash that by excluding specified keysrspec期望通过排除指定键来比较两个哈希
【发布时间】:2019-03-30 05:11:39
【问题描述】:

是否有任何规范期望通过单独排除指定的键来比较两个哈希。

H1 = {'name' => 'XXXXx', 'age' => 29, 'DOB' => 'dd/mm/yyyy'}
H2 = {'name' => 'XXXXX', 'age' => 29, 'DOB' => 'dd/mm/yyyy'}

通过单独排除 DOB 键来比较上述两个哈希。

【问题讨论】:

  • Hash#values_atmatch_array 期望?
  • values_at 将根据 values_at 中指定的键返回一个值数组。但我想单独排除特定的键集
  • Hash#reject 然后。
  • 名称不同("XXXXX""XXXXx")?还是这个错字?
  • 不,这是经过深思熟虑的。今后我应该得到一个结果,因为与 H1 比较时,H2 中的名称不同

标签: ruby rspec


【解决方案1】:

我不明白你为什么需要,但你可以使用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

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

【讨论】:

  • 我认为您将“出生日期”误认为“姓名”。
  • @sawa,谢谢。我注意到名称不同("XXXXX""XXXXx")并误导了自己..
  • 有一个哈希方法delete2,这样{ a:1, b:2, c:3, d:4 }.delete2(:b, :d) #=> { a:1, c:3 }不改变接收者不是很方便吗?
  • @CarySwoveland 好主意。看起来漂亮。也许有一天会出现在 Ruby 中。
【解决方案2】:

与其比较两个等于H1H2 的临时哈希值并删除了键'DOB'(如果存在),不如比较两个具有相同值的键'DOB' 的临时哈希值。该值是任意的;我用过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

与我上面提到的两种方法相比,它具有更适度的内存要求。

【讨论】:

  • 不对称会降低美感。我认为您可以将 {'DOB' => nil} 合并到两个哈希中。
  • @sawa,同意。我做出了改变。谢谢。
  • 你必须切换接收器和关于 H1 的合并参数。否则,如果 H1 的 DOB 值不是 nil,...
  • 希望我终于做对了。 :-)(注意我的笑脸有鼻子。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 2018-06-28
  • 1970-01-01
相关资源
最近更新 更多