在规范中解析 response.body 时收到“JSON::ParserError: 809: unexpected token at '<!DOCTYPE html>”

Posted

技术标签:

【中文标题】在规范中解析 response.body 时收到“JSON::ParserError: 809: unexpected token at \'<!DOCTYPE html>”【英文标题】:Receive "JSON::ParserError: 809: unexpected token at '<!DOCTYPE html>" when parsing response.body in specs在规范中解析 response.body 时收到“JSON::ParserError: 809: unexpected token at '<!DOCTYPE html>” 【发布时间】:2022-01-07 07:55:08 【问题描述】:

所以,为了解决这个问题,我浪费了太多时间。我想在我的 rspec 请求规范中解析 json 响应,为此我创建了:

# 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 '<!DOCTYPE html>
       <html>
         <head>
           <title>Blog</title>
           <meta name="viewport" content="width=device-width,initial-scale=1">
           
           
     
           <link rel="stylesheet" media="all" href="/assets/application-04c3ae28f07e1bf734223bf526d0cdd296440ef53bcb3f80b9f093c6bf02f747.css" data-turbolinks-track="reload" />
           <script src="/packs-test/js/application-dd998cb6b794ecb7e8af.js" data-turbolinks-track="reload"></script>
         </head>
     
         <body>
           <p id="notice"></p>
     
       <h1>Posts</h1>
     
       <table>
         <thead>
           <tr>
             <th colspan="3"></th>
           </tr>
         </thead>
     
         <tbody>
     
             <tr>
               <td><a href="/posts/56">Some title</a></td>
               <td><a href="/posts/56/edit">Edit</a></td>
               <td><a data-confirm="Are you sure?" rel="nofollow" data-method="delete" href="/posts/56">Destroy</a></td>
             </tr>
         </tbody>
       </table>
     
       <br>
     
       <a href="/posts/new">New Post</a>
     
         </body>
       </html>
       '
     # ./spec/support/helper_methods.rb:8:in `json_response'
     # ./spec/requests/posts_spec.rb:21:in `block (3 levels) in <top (required)>'

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 标记。我相信这是非常微不足道的事情,我看不出有什么问题。

我真的很感激能在这方面提供一些帮助。

【问题讨论】:

HTML 不是 JSON——你不能将 HTML dom 解析成 JSON。 啊,你是完全正确的.. 我忘记了我之前盲目复制它的项目,只是 api。谢谢! 【参考方案1】:

好吧,原来这是我这边的错误。正如评论中提到的 dbugger,您无法将 html 文件解析为 json。

【讨论】:

以上是关于在规范中解析 response.body 时收到“JSON::ParserError: 809: unexpected token at '<!DOCTYPE html>”的主要内容,如果未能解决你的问题,请参考以下文章

Android -- 使用OKhttp获取response时遇到的坑

RSpec 控制器测试 - 空白 response.body

Fiddler抓包返回的Response中总是出现"Response body is encoded. Click to decode. "的解决办法

OkHttp踩坑记:为何 response.body().string() 只能调用一次?

解析来自 Restful Web 服务的响应的 C# 代码

OkHttp踩坑记:为何 response.body().string() 只能调用一次?