使用 Rspec 测试 XmlBuilder
Testing XmlBuilder with Rspec
我发布了一个关于使用 XmlBuilder 呈现 XML 的问题 ()。该特定问题已解决,但我 运行 进入另一个测试此控制器操作的问题。
问题似乎与 Rspec 有关,因为用 Minitest 编写的相同测试工作正常,使用 cURL 也工作。
调试时,Rspec 从不尝试呈现 xml 生成器模板。它只是跳过模板并呈现带有空白正文的 http 状态 200。
控制器、xml 生成器、测试和测试结果如下:
controllers/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
/测试/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 控制器测试默认不渲染视图。为了呈现视图,将 render_views
添加到 describe 块:
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
我发布了一个关于使用 XmlBuilder 呈现 XML 的问题 (
问题似乎与 Rspec 有关,因为用 Minitest 编写的相同测试工作正常,使用 cURL 也工作。
调试时,Rspec 从不尝试呈现 xml 生成器模板。它只是跳过模板并呈现带有空白正文的 http 状态 200。
控制器、xml 生成器、测试和测试结果如下:
controllers/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
/测试/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 控制器测试默认不渲染视图。为了呈现视图,将 render_views
添加到 describe 块:
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