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

soc*_*soc 3 ruby hash symbols rspec

我没有使用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
Run Code Online (Sandbox Code Playgroud)

这是失败的地方:

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)>'
Run Code Online (Sandbox Code Playgroud)

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

Paw*_*zak 6

从看起来的代码,您应该更改:

expect(menu.list).to eq({'Clockwise to Titan': 6})
Run Code Online (Sandbox Code Playgroud)

至

expect(menu.list).to eq({'Clockwise to Titan' => 6})
Run Code Online (Sandbox Code Playgroud)

使规格通过。

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

考虑一下:

{'Clockwise to Titan': 6} == {:'Clockwise to Titan' => 6}
Run Code Online (Sandbox Code Playgroud)

但

{'Clockwise to Titan': 6} != {'Clockwise to Titan' => 6}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!