Ruby TestUnit,VCR和HTTP API请求

时间:2013-01-30 17:05:05

标签: ruby api testunit vcr webmock

我正在构建一个API包装器并正在为它编写一些测试,我有几个问题。

1)如何为数据不存在的呼叫编写assert?例如,使用API​​通过id查找成员但用户将不存在。
2)如何编写assert来测试PUTDELETE个请求?

我已经掌握了对其他2个动词的GETPOST请求进行测试。

1 个答案:

答案 0 :(得分:2)

对于你的问题第1部分......

您可以选择不存在的数据:

  1. 您可以提前创建数据,例如使用测试种子文件,夹具或工厂。对于具有更复杂数据安排的大型项目,我喜欢这种选择。我也喜欢这种让事情先发挥作用的选择,因为看到这些数据更为直接。

  2. 您可以创建测试双精度数,例如存根方法或虚假对象。我喜欢这种选择,以获得最快的测试性能和最佳隔离。为了最快的测试,我尽早拦截电话。权衡是我不进行端到端测试。

  3. 对于你的问题第2部分......

    您应该编辑您的问题以显示您的实际代码;这将有助于人们在这里回答你。

    您的VCR代码是这样的吗?

    VCR.use_cassette('test_unit_example') do
      response = Net::HTTP.get_response('localhost', '/', 7777)
      assert_equal "Hello", response.body
    end
    

    如果是这样,你可以改变HTTP get to put,如下所示:

    uri = URI.parse(...whatever you want...)
    json = "...whatever you want..."
    req = Net::HTTP::Put.new(uri)
    req["content-type"] = "application/json"
    req.body = json
    request(req)
    

    HTTP删除相同:

    Net::HTTP::Delete.new(uri)
    

    一篇好的博客文章是http://www.rubyinside.com/nethttp-cheat-sheet-2940.html>Net::HTTP备忘单摘录在这里:

    # Basic REST.
    # Most REST APIs will set semantic values in response.body and response.code.
    require "net/http"
    
    http = Net::HTTP.new("api.restsite.com")
    
    request = Net::HTTP::Post.new("/users")
    request.set_form_data({"users[login]" => "quentin"})
    response = http.request(request)
    # Use nokogiri, hpricot, etc to parse response.body.
    
    request = Net::HTTP::Get.new("/users/1")
    response = http.request(request)
    # As with POST, the data is in response.body.
    
    request = Net::HTTP::Put.new("/users/1")
    request.set_form_data({"users[login]" => "changed"})
    response = http.request(request)
    
    request = Net::HTTP::Delete.new("/users/1")
    response = http.request(request)