为什么我的控制器在 rspec 执行中的行为与在浏览器执行中的行为不同?
Why is my controller acting different in the rspec execution than in the browser execution?
我有我的控制器:
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 PDF渲染。呈现的模板如下所示:
<%= 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 模板中,即 /bunknotes/show.pdf.erb,我正在引用文件 'details'。由于我的控制器是 Api::BunknotesController
(还有另一个名为 BunknotesController
的控制器,没有前缀,它首先有这个模板的副本),相对包含将尝试在 [=62= 中找到文件]/ 而不是 /app/views/bunknotes.
通过尝试在我的浏览器中点击它,我在尝试呈现 pdf 时得到 500,并且未达到 byebug
指令(正如任何人在出于特殊目的出现任何异常时所期望的那样rails 中的 RecordInvalid
等)。由于其他内部结构,在这种情况下生成的 pdf 已损坏(稍后我们将修复此问题,但目前它是一个好兆头,表明某些事情进展不顺利)。
然而,当 运行 测试
时会触发完全不同的行为
我的测试文件如下所示:
# ... 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,returns 500 代码,然后失败。
总结:
- 是的,我会修复包含视图的路径,使其成为绝对路径。
- 是的,我会修复损坏的 pdf 生成,这样就不会发送任何 pdf 附件文件。
- 测试不应该像它那样成功。仅当响应代码为 200 时,测试才有望成功。这是正确的,但是控制器在 rspec 执行中产生了 200,而在浏览器执行中返回了 500。
为什么我的控制器在 rspec 执行中的行为与在浏览器执行中的行为不同?
我正在使用:
- Ruby 2.3.0p0
- Rails 3.2.22.2
- RSpec 3.4.1
默认情况下 Rails / RSpec 不会在测试中为控制器呈现视图。要渲染视图,请在规范顶部添加一个 render_views
调用,如
describe Api::BunknotesController do
render_views
#
#
it "does..." do
end
end
我有我的控制器:
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 PDF渲染。呈现的模板如下所示:
<%= 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 模板中,即 /bunknotes/show.pdf.erb,我正在引用文件 'details'。由于我的控制器是 Api::BunknotesController
(还有另一个名为 BunknotesController
的控制器,没有前缀,它首先有这个模板的副本),相对包含将尝试在 [=62= 中找到文件]/ 而不是 /app/views/bunknotes.
通过尝试在我的浏览器中点击它,我在尝试呈现 pdf 时得到 500,并且未达到 byebug
指令(正如任何人在出于特殊目的出现任何异常时所期望的那样rails 中的 RecordInvalid
等)。由于其他内部结构,在这种情况下生成的 pdf 已损坏(稍后我们将修复此问题,但目前它是一个好兆头,表明某些事情进展不顺利)。
然而,当 运行 测试
时会触发完全不同的行为我的测试文件如下所示:
# ... 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,returns 500 代码,然后失败。
总结:
- 是的,我会修复包含视图的路径,使其成为绝对路径。
- 是的,我会修复损坏的 pdf 生成,这样就不会发送任何 pdf 附件文件。
- 测试不应该像它那样成功。仅当响应代码为 200 时,测试才有望成功。这是正确的,但是控制器在 rspec 执行中产生了 200,而在浏览器执行中返回了 500。
为什么我的控制器在 rspec 执行中的行为与在浏览器执行中的行为不同?
我正在使用:
- Ruby 2.3.0p0
- Rails 3.2.22.2
- RSpec 3.4.1
默认情况下 Rails / RSpec 不会在测试中为控制器呈现视图。要渲染视图,请在规范顶部添加一个 render_views
调用,如
describe Api::BunknotesController do
render_views
#
#
it "does..." do
end
end