【问题标题】:Rails Request Rspec Jbuilder, request.body is a StringIO objectRails Request Rspec Jbuilder,request.body 是 StringIO 对象
【发布时间】:2015-09-07 05:42:03
【问题描述】:

我正在使用 Ruby on Rails 开发一个项目,我决定使用 Jbuilder 来处理我的模型的 json 序列化。但是,当使用 Rspec 使用请求规范测试我的控制器时,使用 *.json.jbuilder 视图,我的 request.bodyStringIO 对象的形式返回,而不是 String

我在受影响控制器中的方法如下所示:

def list
  @groups = ...
end

list.json.jbuilder 文件看起来像:

json.array! @groups, :id, :name

测试 sn-p 看起来像:

get '/api/v1/groups', { :format => :json }
puts request.body.class.name # gives StringIO instead of String...

我正在使用 Rails 4.2.2、Ruby 2.2.2、Rspec-Rails 3.3.2 和 JBuilder 2.3.0

我已经在我的rails_helper.rb中设置了:

config.render_views # tried with config.render_views = true too

异常的堆栈跟踪是:

Failure/Error: expect(json['groups'].length).to eq (2)
 TypeError:
   no implicit conversion of StringIO into String

我可以补充一点,它在不使用 Rspec 时工作

谢谢

【问题讨论】:

  • 不要在你的 rails_helper.rb 中设置config.render_views,因为它会减慢你所有的控制器规格。而是在每个规范的基础上或在上下文块中执行它。

标签: ruby-on-rails ruby rspec


【解决方案1】:

如果您想测试控制器的输出,您需要使用response.body 而不是request.bodyrequest.body是客户端提交表单时发送的内容。

【讨论】:

  • 我不知道为什么 Rack::Test(RSpec 控制器测试建立在其之上)为 request.body 使用 StringIO 对象,但这是另一个问题。
  • 2 小时的谷歌搜索,这是错误 -.-,当你编码时间过长而没有休息时会发生这种情况......
猜你喜欢
  • 1970-01-01
  • 2018-01-06
  • 2017-04-13
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 2017-02-28
  • 2017-10-14
相关资源
最近更新 更多