代码之家  ›  专栏  ›  技术社区  ›  oma

使用真正的XML和JSON请求/响应自动测试Rails应用程序,作为API文档?

  •  4
  • oma  · 技术社区  · 14 年前

    我应该善待我的Web服务消费者,并为他们提供一些很好的示例,尽管维护一个大型XML请求测试并不有趣。有更好的方法成为一个好的WS提供者吗?

    我没有HTML。该应用同时接受XML和JSON,因此为了确保API示例(XML和JSON)的有效性,我想在集成套件中证明它们的正确性。

    在你的回答中,我想看看一些例子,而不是“只尝试黄瓜/网鼠/水豚”。没有HTML很难找到如何操作。谢谢你的帮助!

    2 回复  |  直到 13 年前
        1
  •  2
  •   Alex Paul Becotte    13 年前

    由于您不需要Webrat/Capybara的奇特功能来执行JavaScript或处理任意HTML,因此只需使用 basic integration test support from rails .

    我将以某种形式存储API示例,这种形式可以很容易地转换为XML或JSON,然后在集成测试中使用此文件,以便在只维护测试请求的一种表示形式的同时测试这两种格式类型。您还可以编写一个任务,从中为文档生成API示例。

    测试中任何API调用的完整响应体都将存储在@response.body中,您可以随意分析/验证。

        2
  •  1
  •   oma    14 年前

    我有这个独立的脚本,允许我发送XML请求,但需要一个服务器:

    require 'rubygems'
    require 'net/http'
    require 'json'
    url = URI.parse('http://localhost:3030/myresource.xml')
    request = Net::HTTP::Post.new(url.path)
    request.content_type="text/xml"
    request.basic_auth('user', 'secret')
    request.body = "<?xml version='1.0' encoding='UTF-8'?><somedata><name>Test Name 1</name><description>Some data for testing</description></somedata>"
    response = Net::HTTP.start(url.host, url.port) {|http| http.request(request)}
    puts response
    

    最后,我可以在不启动服务器的情况下使用rspec 2完成这项工作。将其放入规范文件中 spec/requests 使我可以在没有Webrat或Capybara的应用程序中执行此操作。

    用于XML

    post("/myresource.xml", 
         some_xml_string,
         {"CONTENT_TYPE" => "text/xml",
          "HTTP_AUTHORIZATION" => ActionController::HttpAuthentication::Basic.encode_credentials("user", "secret")})
    

    和JSON

    post("/myresource.json",
          some_json_string,
          {"CONTENT_TYPE" => "application/json",
           "HTTP_AUTHORIZATION" => ActionController::HttpAuthentication::Basic.encode_credentials("user", "secret")})
    

    现在我想我可以建造 some_xml_string 从像我这样的远程资源 文档XML或JSON文件(某些http://resource) 例如。是的,它更需要维护,而且测试很脆弱。我得好好想想…改变外部人员使用的API并不是一件轻而易举的事情,而是一种权衡。欢迎有更好的建议!