如何为XML方法设置Rails集成测试?

时间:2008-09-12 18:11:43

标签: xml ruby integration-testing

给出一个控制器方法,如:

def show
  @model = Model.find(params[:id])

  respond_to do |format|
    format.html # show.html.erb
    format.xml  { render :xml => model }
  end
end

编写一个声明返回符合预期XML的集成测试的最佳方法是什么?

5 个答案:

答案 0 :(得分:12)

在集成测试中使用format和assert_select的组合很有用:

class ProductsTest < ActionController::IntegrationTest
  def test_contents_of_xml
    get '/index/1.xml'
    assert_select 'product name', /widget/
  end
end

有关详细信息,请查看Rails文档中的assert_select

答案 1 :(得分:5)

这是从控制器测试xml响应的惯用方法。

class ProductsControllerTest < ActionController::TestCase
  def test_should_get_index_formatted_for_xml
    @request.env['HTTP_ACCEPT'] = 'application/xml'
    get :index
    assert_response :success
  end
end

答案 2 :(得分:5)

ntalbott的答案显示了一个获取行动。后期行动有点棘手;如果要将新对象作为XML消息发送,并且XML属性显示在控制器的params散列中,则必须正确获取标头。这是一个例子(Rails 2.3.x):

class TruckTest < ActionController::IntegrationTest
  def test_new_truck
    paint_color = 'blue'
    fuzzy_dice_count = 2
    truck = Truck.new({:paint_color => paint_color, :fuzzy_dice_count => fuzzy_dice_count})
    @headers ||= {}
    @headers['HTTP_ACCEPT'] = @headers['CONTENT_TYPE'] = 'application/xml'
    post '/trucks.xml', truck.to_xml, @headers
    #puts @response.body
    assert_select 'truck>paint_color', paint_color
    assert_select 'truck>fuzzy_dice_count', fuzzy_dice_count.to_s
  end
end

你可以在这里看到post的第二个参数不一定是参数哈希;它可以是一个字符串(包含XML),如果标题是正确的。第三个论点是@headers,是我花了很多时间研究的部分。

(还要注意在比较assert_select中的整数值时使用to_s。)

答案 3 :(得分:1)

这两个答案很棒,只是我的结果包括datetime字段,这些字段在大多数情况下都是不同的,所以assert_equal失败了。看来我需要使用XML解析器处理包含@response.body,然后比较各个字段,元素数量等等。还是有更简单的方法?

答案 4 :(得分:0)

设置请求对象接受标题:

@request.accept = 'text/xml' # or 'application/xml' I forget which

然后你可以断言响应体等于你所期望的

assert_equal '<some>xml</some>', @response.body