【问题标题】:RSpec - A JSON text must at least contain two octetsRSpec - JSON 文本必须至少包含两个八位字节
【发布时间】:2019-04-13 11:25:53
【问题描述】:

升级rspec-rails (2.5.2 -> 3.8.1)capybara (2.18.0 -> 3.10.1) 后的两个失败规范:

不太清楚这里发生了什么。看起来期望中的文本被截断了?!?

  let(:story_attributes) do
    {
      title:       'Edited title',
      description: 'Edited location',
      start_year:  '2001',
      start_month: 'December',
      start_day:   '5',
      end_year:    '2001',
      end_month:   'October',
      end_day:     '10',
      is_range:    true,
      cover_image: {
        url: 'http://placehold.it/edited.png'
      }
    }
  end

  ... 

  within 'section.story-cover' do
    expect(page).to have_text 'Edited title'
    expect(page).to have_text 'Edited location'
    expect(page).to have_text 'December 5th - October 10th, 2001'
  end

在第一个失败的示例(下)中,“已编辑位置”被截断。

在第二个示例 expect(page).to have_text 'Edited title Edited location' 中,仅找到“已编辑的标题\n已编辑的位置”。

然后是这个“JSON 文本必须至少包含两个八位字节”的问题,它可能相关也可能不相关,但这在升级 rspec-rails 和 capybara.ds 之前曾经通过

想法?

RSpec Failures:

  1) Story editing published edit story
     Failure/Error: JSON.parse(response.body)

     JSON::ParserError:
       A JSON text must at least contain two octets!
     # ./app/services/converter/image_service.rb:36:in `post_to_filepicker'
     # ./app/services/converter/image_service.rb:18:in `convert_format'
     # ./app/services/converter/image_service.rb:11:in `block in convert'
     # ./app/services/converter/image_service.rb:10:in `each'
     # ./app/services/converter/image_service.rb:10:in `convert'
     # ./app/models/images/image.rb:5:in `convert'
     # ./app/models/images/image.rb:20:in `enqueue_conversion'
     # ./app/services/story/updating_service.rb:14:in `update'
     # ./app/controllers/stories_controller.rb:58:in `update'
     # ------------------
     # --- Caused by: ---
     # Capybara::ExpectationNotMet:
     #   expected to find text "Edited location" in "Edited title\nLyla HoegerEditedDecember 5th - October 10th, 2001Download"
     #   ./spec/features/stories/editing_spec.rb:86:in `block (4 levels) in <top (required)>'

  2) Story editing private private story should be read after editing
     Failure/Error: JSON.parse(response.body)

     JSON::ParserError:
       A JSON text must at least contain two octets!
     # ./app/services/converter/image_service.rb:36:in `post_to_filepicker'
     # ./app/services/converter/image_service.rb:18:in `convert_format'
     # ./app/services/converter/image_service.rb:11:in `block in convert'
     # ./app/services/converter/image_service.rb:10:in `each'
     # ./app/services/converter/image_service.rb:10:in `convert'
     # ./app/models/images/image.rb:5:in `convert'
     # ./app/models/images/image.rb:20:in `enqueue_conversion'
     # ./app/services/story/updating_service.rb:14:in `update'
     # ./app/controllers/stories_controller.rb:58:in `update'
     # ------------------
     # --- Caused by: ---
     # Capybara::ExpectationNotMet:
     #   expected to find text "Edited title Edited location" in "Edited title\nEdited locat"
     #   ./spec/features/stories/editing_spec.rb:115:in `block (4 levels) in <top (required)>'

【问题讨论】:

  • 请提供您的规格和相关代码,并不是每个人都熟悉版本之间如此具体的变化。谢谢!
  • 我添加了更多细节,但在我看来,期望是非常普通的。我想还有其他事情发生吗?!?

标签: ruby-on-rails json rspec capybara rspec-rails


【解决方案1】:

Capybara 2.x 和 3.x 之间的一个重大变化是,在 Capybara 3.x 中,返回的文本尽可能接近显示的内容。这意味着当它们显示给用户时,换行符现在包含在返回的文本中 - https://github.com/teamcapybara/capybara/blob/master/UPGRADING.md。您需要在 spec/features/stories/editing_spec.rb:115 将预期文本更改为“已编辑标题\n已编辑位置”,或者如果您不关心换行符,您可以使用 :normalize_ws 选项 => @987654324 @

【讨论】:

  • 这太棒了!谢谢!使用 RSpec 和 Capybara 的文档的权威来源在哪里?在寻找解决此问题的方法时,我永远不会找到 normalize_ws
  • 文档 - rubydoc.info/github/teamcapybara/capybara 是信息的最佳来源 - 以及 History.md 文件的更改列表。 github 上有一个 gitter 页面链接,用于讨论事情或只是在这里发帖,有人会在合理的时间内回答。
猜你喜欢
  • 2012-01-13
  • 2016-08-30
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 2021-04-21
  • 2022-01-13
  • 2022-08-21
相关资源
最近更新 更多