読者です 読者をやめる 読者になる 読者になる

【Rails4】json_spec で JSONのテスト 及び MultiJson::ParseError対応

json_spec導入

Gemfile

gem 'json_spec'


spec/spec_helper.rb

RSpec.configure do |config|
  #JSON検査
  config.include JsonSpec::Helpers
:
:


検証
以下のJSONを検証する(kaminari APIより抜粋)
"meta":{"current-page":1,"next-page":2,"prev-page":null,"total-pages":2,"total-count":9}}

#"meta":{"current-page":1,"next-page":2,"prev-page":null,"total-pages":2,"total-count":9}}
body = response.body

#metaが存在すること
expect(body).to have_json_path('meta')

#meta/total-countは7であること
expect(body).to be_json_eql(7).at_path('meta/total-count')

#meta/total-pagesはIntegerであること
expect(body).to have_json_type(Integer).at_path('meta/total-pages')

#metaは要素を5つ持つこと(Arrayに使う方がしっくりする...)
expect(body).to have_json_size(5).at_path('meta')

(注意)文字列をbe_json_eqlで検証する場合 MultiJson::ParseError が発生します。

names = %({"first_name":"Steve","last_name":"Richert"})
expect(names).to be_json_eql("Steve").at_path("first_name")
#MultiJson::ParseError:
#       795: unexpected token at 'Steve'

解決策: JSON同士の比較のため対象文字列をJSONにする必要があります。

names = %({"first_name":"Steve","last_name":"Richert"})
expect(names).to be_json_eql("Steve".to_json).at_path("first_name")