2017-02-24 19 views
0

解析我有这样的RSpec代码:JSON没有被正确的JSON.load在我的规格测试

require 'rails_helper' 

require 'integrations/youtube' 

RSpec.describe YoutubeIntegration do 

    let(:empty_playlist) { 
    <<-JSON 
    { 
    "kind": "youtube#playlistItemListResponse", 
    "etag": "\"uQc-MPTsstrHkQcRXL3IWLmeNsM/ewwRz0VbTYpp2EGbOkvZ5M_1mbo\"", 
    "pageInfo": { 
     "totalResults": 0, 
     "resultsPerPage": 5 
    }, 
    "items": [] 
    } 
    JSON 
    } 

    context '- Auxiliary methods -' do 

    end 

    context '- Endpoint calls -' do 

    it 'get_playlist_data' do 
     obj = YoutubeIntegration.new 
     response = obj.call('youtube','get_playlist_data',nil,:playlistId => "PL3umUDtI6E97kwmnzth_kMnOD0fkwJtuB") 
     myjson = JSON.parse(response.body) 
     expect(myjson).to eq JSON.load(empty_playlist) 
    end 

    end 

end 

它发生YouTube数据API真的返回etag这种方式,用引号内,你可能见here

但是当我运行这个天赋,我得到这个错误

enter image description here

解析错误意外的标记。我测试了这个JSON在http://jsonlint.com,这很好,但JSON#load不会解析它。

在另一方面,如果我把内报价并做只是这一点:

let(:empty_playlist) { 
    <<-JSON 
    { 
    "kind": "youtube#playlistItemListResponse", 
    "etag": "uQc-MPTsstrHkQcRXL3IWLmeNsM/ewwRz0VbTYpp2EGbOkvZ5M_1mbo", 
    "pageInfo": { 
     "totalResults": 0, 
     "resultsPerPage": 5 
    }, 
    "items": [] 
    } 
    JSON 
    } 

然后我得到这个错误

enter image description here

因为现在,当然,内容etag与预期不同。

我该如何处理?

回答

1

如果问题是加载与empty_playlist的格式,你可以用哈希代表它...不是一个原始字符串...

那么你可以使用

let(:empty_playlist) do 
    { 
    "kind": "youtube#playlistItemListResponse", 
    "etag": "\"uQc-MPTsstrHkQcRXL3IWLmeNsM/ewwRz0VbTYpp2EGbOkvZ5M_1mbo\"", 
    "pageInfo": { 
     "totalResults": 0, 
     "resultsPerPage": 5 
    }, 
    "items": [] 
    } 
end 

context '- Auxiliary methods -' do 

end 

context '- Endpoint calls -' do 

    it 'get_playlist_data' do 
    obj = YoutubeIntegration.new 
    response = obj.call('youtube','get_playlist_data',nil,:playlistId => "PL3umUDtI6E97kwmnzth_kMnOD0fkwJtuB") 
    myjson = JSON.parse(response.body) 
    expect(myjson).to eq empty_playlist 
    end 

end 
+0

这解决了我的问题,但请编辑别人的将来参考。而不是'expect(myjson).to eq empty_playlist.as_json',它只是'expect(myjson).to eq empty_playlist'。由于我们声明了一个哈希对象,因此我们不需要将其转换为JSON格式。 –

+1

完全正确... – cefigueiredo

1

我认为你的问题是,heredoc使用双引号来允许插值。这将导致你的empty_playlist字符串实际上看起来像:

" { 
    \"kind\": \"youtube#playlistItemListResponse\", 
    \"etag\": \"\"uQc-MPTsstrHkQcRXL3IWLmeNsM/ewwRz0VbTYpp2EGbOkvZ5M_1mbo\"\", 
    \"pageInfo\": { 
     \"totalResults\": 0, 
     \"resultsPerPage\": 5 
    }, 
    \"items\": [] 
    }" 

注意额外的周围的eTag值逃逸。

你可以只使用单引号,或者你可能会增加一倍逃脱引号例如

let(:empty_playlist) { 
    '{ 
    "kind": "youtube#playlistItemListResponse", 
    "etag": "\"uQc-MPTsstrHkQcRXL3IWLmeNsM/ewwRz0VbTYpp2EGbOkvZ5M_1mbo\"", 
    "pageInfo": { 
    "totalResults": 0, 
    "resultsPerPage": 5 
    }, 
    "items": [] 
    }' 
} 

OR

let(:empty_playlist) { 
    <<-JSON 
    { 
     "kind": "youtube#playlistItemListResponse", 
     "etag": "\\"uQc-MPTsstrHkQcRXL3IWLmeNsM/ewwRz0VbTYpp2EGbOkvZ5M_1mbo\\"", 
     "pageInfo": { 
     "totalResults": 0, 
     "resultsPerPage": 5 
     }, 
     "items": [] 
    } 
    JSON 
} 

无论这些人会正确地JSON::load

相关问题