使用 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