首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我的控制器在rspec执行中的行为不同于浏览器执行?

为什么我的控制器在rspec执行中的行为不同于浏览器执行?
EN

Stack Overflow用户
提问于 2016-06-27 16:01:18
回答 1查看 151关注 0票数 0

我有我的控制器:

代码语言:javascript
运行
复制
class Api::BunknotesController < Api::ApiController
  # ... omitted code
  def show
    @bunknote =
      current_user.bunknotes.includes(:person).find(params[:id])

    respond_to do |format|
      format.html {
        render layout: false
      }
      format.pdf {
        render pdf: @bunknote.filename,
          template: '/bunknotes/show.pdf',
          margin: { top: 5, bottom: 5 }
        byebug
      }
      format.json {
        render json: @bunknote.api_json(true)
      }
    end
  end
  # ... omitted code
end

在第二种格式中,Wicked用于呈现。呈现的模板如下所示:

代码语言:javascript
运行
复制
<%= wicked_pdf_stylesheet_link_tag "bunknotes" %>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<div class="page <% if @bunknote.reply %>pagebreak<% end %> bunknote_pdf">
    <div class="bn-id">bn<%= @bunknote.id %></div>
    <h1>Bunk Note to <%= @bunknote.person ? @bunknote.person.name : @bunknote.writein %> <%= "(#{@bunknote.address})" if @bunknote.address && @bunknote.address.length > 1 %></h1>
    <%= render partial: 'details', locals: { :bunknote => @bunknote } %>
</div>
<% if @bunknote.reply %>
<div class="page bunkreply-stationery">
  <%=
    render partial: '/common/stationery',
    locals: {
      user_fullname: @bunknote.user.fullname,
      org_name: @bunknote.organization.name,
      org_id: @bunknote.organization.id,
      user_id: @bunknote.user.id,
      bunknote_id: "bn#{@bunknote.id}",
      barcode_value: "#{has_bunknote = 1}#{@bunknote.id}",
      height: "720px",
      camper_name:  @bunknote.person ? @bunknote.person.name : @bunknote.writein
    }
  %>
</div>
<% end %>

当我试图击中我的控制器,我有一个模板错误。错误的本质是这样的:在我的show.pdf.erb模板(即/bunknote/how.pdf.erb)中,我引用的是文件'details‘。因为我的控制器是Api::BunknotesController (有另一个名为BunknotesController的控制器,首先没有前缀,它有此模板的副本),因此相对的包含将尝试在/app/view/api/bunknote/而不是/app/view/bunknote中找到文件。

通过尝试在我的浏览器中点击它,当我试图呈现pdf时,我得到了一个500,并且没有达到byebug指令(就像任何人在rails (如RecordInvalid等)中有任何特殊目的的异常时所期望的那样)。由于其他内部因素,生成的pdf在这个场景中是错误的(稍后我们将修复它,但现在它是一些事情不顺利的好迹象)。

然而,在运行测试时会触发完全不同的行为。

我的测试文件看起来如下:

代码语言:javascript
运行
复制
# ... omitted code
describe Api::BunknotesController do
    # ... omitted code
    it "gets a bunknote (PDF)" do
      get :show, {id: bunknote1.id, format: :pdf}
      expect(response.status).to be 200
    end
    # ... omitted code
end
# ... omitted code

当rspec实用程序运行此示例时,控制器将生成一个空白pdf (无损坏,但完全为空白),并返回200个响应代码。

如果一切顺利的话,我做这个测试是为了获得200条代码的成功。当显示视图(为了我的需要)引用内部视图时,测试应该失败。但是它成功了,看起来像尿布一样吸收了错误,并生成了空白的PDF文件。我希望这与浏览器调用完全一样,生成损坏的pdf,返回500个代码,然后失败。

摘要

  1. 是的,我将修复包含的视图的路径,因此它是绝对的。
  2. 是的,我将修复损坏的pdf生成,这样就不会发送pdf附件文件。
  3. 这个测试不应该像它那样成功。只有当响应代码为200时,测试才会成功。这是正确的,但是控制器在rspec执行中产生了200,而在浏览器执行中返回了500。

为什么我的控制器在rspec执行中的行为不同于浏览器执行?

我正在使用:

  • Ruby 2.3.0p0
  • Rails 3.2.22.2
  • RSpec 3.4.1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-27 16:17:41

默认情况下,Rails / RSpec不会在测试中为控制器呈现视图。要使视图呈现,在规范的顶部添加一个render_views调用,如下所示

代码语言:javascript
运行
复制
describe Api::BunknotesController do
  render_views
  #
  #
  it "does..." do
  end
end
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38058481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档