我发布了一个有关使用 XmlBuilder 呈现 XML 的问题 ( Rails XML builder not rendering )。该特定问题已解决,但我在测试此 Controller 操作时遇到了另一个问题。
问题似乎出在 Rspec 上,因为在 Minitest 中编写的相同测试工作正常,并且使用 cURL 也可以工作。
在调试时,Rspec 从不尝试渲染 xml 构建器模板。它只是跳过模板并呈现带有空白正文的 http 状态 200。
以下是 Controller 、xml 构建器、测试和测试结果:
Controller /bars_controller.rb
require 'builder'
class BarsController < ApplicationController
def show
@bar = Bar.find(params[:id])
render template: 'bars/show.xml.builder', formats: [:xml]
end
end
/views/bars/show.xml.builder
xml.instruct!
xml.bar do
xml.foo(@bar.foo)
xml.bar(@bar.bar)
end
/test/controllers/bars_controller_test.rb
require 'test_helper'
class BarsControllerTest < ActionController::TestCase
setup do
@bar = Bar.create(foo: 'bar', bar: 'foo')
end
test "should show bar" do
get :show, id: @bar
assert_response :success
assert_match "<bar>", response.body
end
end
/spec/controllers/bars_controller_spec.rb
require_relative '../rails_helper'
describe BarsController do
describe 'a POST to :show' do
before do
@bar = Bar.create(foo: 'bar', bar: 'foo')
post :show, id: @bar
end
it 'should show bar' do
expect(response).to be_success
expect(response.body).to include("<bar>")
end
end
end
测试结果
> rake test
Run options: --seed 50688
# Running:
.
Finished in 0.096901s, 10.3198 runs/s, 30.9593 assertions/s.
1 runs, 3 assertions, 0 failures, 0 errors, 0 skips
> rspec spec/controllers/bars_controller_spec.rb
F
Failures:
1) BarsController a POST to :show responds with xml bar
Failure/Error: expect(response.body).to include("<bar>")
expected "" to include "<bar>"
# ./spec/controllers/bars_controller_spec.rb:13:in `block (3 levels) in <top (required)>'
Finished in 0.01726 seconds (files took 1.53 seconds to load)
1 example, 1 failure
Failed examples:
rspec ./spec/controllers/bars_controller_spec.rb:11 # BarsController a POST to :show responds with xml bar
最佳答案
默认情况下,RSpec Controller 测试不渲染 View 。为了渲染 View ,请将 render_views
添加到描述 block :
describe 'a POST to :show' do
render_views
before do
@bar = Bar.create(foo: 'bar', bar: 'foo')
post :show, id: @bar
end
it 'should show bar' do
expect(response).to be_success
expect(response.body).to include("<bar>")
end
end
关于ruby-on-rails - 使用 Rspec 测试 XmlBuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30089597/