#json #ruby-on-rails #rspec
Вопрос:
Итак, я потерял слишком много времени, пытаясь решить эту проблему. Я хотел бы проанализировать ответ json в моих спецификациях запроса rspec, и для этого я создал:
# support/helper_methods.rb module HelperMethods def json_response JSON.parse(response.body) end end
# rails_helper.rb RSpec.configure do |config| ... config.include HelperMethods end
и хотел бы использовать его в простой спецификации запроса:
# requests/post_spec.rb require 'rails_helper' RSpec.describe 'Posts', type: :request do describe 'GET /posts' do let(:post) { create(:post) } before { post } it 'returns status 200' do get '/posts' expect(response.status).to eq(200) end it 'renders posts' do get '/posts' expect(json_response).to include('Some title') end end end
Однако второй пример завершается ошибкой с сообщением:
# bundle exec rspec result Failures: 1) Posts GET /posts renders posts Failure/Error: JSON.parse(response.body) JSON::ParserError: 809: unexpected token at 'lt;!DOCTYPE htmlgt; lt;htmlgt; lt;headgt; lt;titlegt;Bloglt;/titlegt; lt;meta name="viewport" content="width=device-width,initial-scale=1"gt; lt;link rel="stylesheet" media="all" href="/assets/application-04c3ae28f07e1bf734223bf526d0cdd296440ef53bcb3f80b9f093c6bf02f747.css" data-turbolinks-track="reload" /gt; lt;script src="/packs-test/js/application-dd998cb6b794ecb7e8af.js" data-turbolinks-track="reload"gt;lt;/scriptgt; lt;/headgt; lt;bodygt; lt;p id="notice"gt;lt;/pgt; lt;h1gt;Postslt;/h1gt; lt;tablegt; lt;theadgt; lt;trgt; lt;th colspan="3"gt;lt;/thgt; lt;/trgt; lt;/theadgt; lt;tbodygt; lt;trgt; lt;tdgt;lt;a href="/posts/56"gt;Some titlelt;/agt;lt;/tdgt; lt;tdgt;lt;a href="/posts/56/edit"gt;Editlt;/agt;lt;/tdgt; lt;tdgt;lt;a data-confirm="Are you sure?" rel="nofollow" data-method="delete" href="/posts/56"gt;Destroylt;/agt;lt;/tdgt; lt;/trgt; lt;/tbodygt; lt;/tablegt; lt;brgt; lt;a href="/posts/new"gt;New Postlt;/agt; lt;/bodygt; lt;/htmlgt; ' # ./spec/support/helper_methods.rb:8:in `json_response' # ./spec/requests/posts_spec.rb:21:in `block (3 levels) in lt;top (required)gt;' Finished in 49.49 seconds (files took 0.46187 seconds to load) 2 examples, 1 failure Failed examples: rspec ./spec/requests/posts_spec.rb:17 # Posts GET /posts renders posts
Я попытался выяснить, не является ли это какой-то проблемой с доктипом, однако пропуск дает ту же ошибку, но на этот раз с html-тегом. Я считаю, что это что-то очень тривиальное, я не вижу ничего плохого в этом.
Я был бы очень признателен за некоторую помощь в этом вопросе.
Комментарии:
1. HTML-это не JSON-вы не можете проанализировать HTML-dom в JSON.
2. ах, вы совершенно правы.. я забыл, что мои предыдущие проекты, из которых я слепо скопировал его, были только для api. Спасибо!
Ответ №1:
Что ж, оказалось, что это была ошибка с моей стороны. Как упоминал dbugger в комментарии, вы не можете анализировать html-файлы в json.