Rspec - 比较两个 json 值

Rspec - Compare two json values

我收到了render json: { success: 'Success' }的回复,我在想测试回复是否收到这样的内容时遇到了问题。我的单元测试是:

    let(:success) do
      {
        success: "Success"
      }
    end

    it 'responds with json containing the success message' do
        expect(JSON.parse(response.body)).to eq(success)
    end

我的测试失败了,即:

expected: {:success=>"Success"}
got:      {"success"=>"Success"}

我试着给success:'Success'加上双引号,这样它就变成了'success':'Success',但还是有同样的问题。我有两个问题,第一个是为什么成功前面有一个冒号,第二个是我怎么去掉它?

JSON.parse 默认会有字符串-y 键。

my_hash = JSON.parse(response.body)
p my_hash.keys.first.class # String

如果你想让它符号化按键,

my_hash = JSON.parse(response.body, symbolize_names: true)
p my_hash.keys.first.class # Symbol

注意:该选项称为 symbolize_names 而不是 symbolize_keys

记住符号不是字符串:

p :success == 'success' # false

我猜您正在尝试使用 JSON 格式测试 API 响应。您可以尝试 json_spec gem 以及许多其他有用的功能 https://github.com/collectiveidea/json_spec