由于符号而不是 Rails 导致哈希失败的 RSpec 测试

Posted

技术标签:

【中文标题】由于符号而不是 Rails 导致哈希失败的 RSpec 测试【英文标题】:RSpec test of hash failing due to symbol, not Rails 【发布时间】:2015-06-28 13:44:23 【问题描述】:

我没有使用 Rails,只是使用 Ruby 和 RSpec 并试图通过哈希对测试。正确的结果在 IRB 上通过,但测试始终包含使测试失败的分号。

这是 RSpec 测试:

 describe Menu do
      let(:menu)  described_class.new 
      let(:book)  double :book, name: 'Clockwise to Titan', price: 6 

      it 'can add a dish to the menu list' do
        menu.add(book)
        expect(menu.list).to eq('Clockwise to Titan': 6)
      end
    end

这是失败:

Failures:

1) Menu can add a dish to the menu list
   Failure/Error: expect(menu.list).to eq('Clockwise to Titan': 6)

   expected: :"Clockwise to Titan"=>6
        got: "Clockwise to Titan"=>6

   (compared using ==)

   Diff:
   @@ -1,2 +1,2 @@
   -:"Clockwise to Titan" => 6,
   +"Clockwise to Titan" => 6,

 # ./spec/menu_spec.rb:9:in `block (2 levels) in <top (required)>'

我在 Stack Overflow 上找到了许多关于 HashWithIndifferentAccess 解决的类似问题的参考资料,但我没有使用 Rails。此外,有时建议的 stringify_keys 方法也不起作用。

【问题讨论】:

【参考方案1】:

从代码看起来,你应该改变:

expect(menu.list).to eq('Clockwise to Titan': 6)

expect(menu.list).to eq('Clockwise to Titan' => 6)

使规范通过。

您的问题是,您定义了一个hash,其中的键不是String,而是Symbol

考虑一下:

'Clockwise to Titan': 6 == :'Clockwise to Titan' => 6

但是

'Clockwise to Titan': 6 != 'Clockwise to Titan' => 6

希望这会有所帮助!

【讨论】:

以上是关于由于符号而不是 Rails 导致哈希失败的 RSpec 测试的主要内容,如果未能解决你的问题,请参考以下文章

Rails 将 YAML 加载到散列并按符号引用

将字符串转换为哈希符号的最佳方法

超链接中的和号导致 W3C 验证失败

Rails:“bundle install”由于旧的 rails 版本(3.2)而失败

为啥关键字参数必须作为带有符号键的哈希传递,而不是 Ruby 中的字符串键?

Ruby on Rails“由于bot而导致的UTF-8中无效的字节序列”