2017-02-24 21 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

相關問題