Ruby on rails 如何测试JSON API?

Ruby on rails 如何测试JSON API?,ruby-on-rails,json,web-services,unit-testing,testing,Ruby On Rails,Json,Web Services,Unit Testing,Testing,我正在组装一个JSON API,它可能是也可能不是用 轨道。我希望能够验证JSON API是否按照 通过从一个只通过 HTTP 例如,测试客户端将向服务器上的给定URL发送请求 测试服务器,然后验证响应是否为JSON字符串 符合规范的要求。响应也可以是HTTP 响应代码,如401 我目前正在使用QUnit和jQuery.ajax运行测试。它是有效的,但是 我想知道是否有更好的选择。还有其他人做过吗 像这样的 谢谢 似乎有些人已经在黄瓜上找到了成功的方法(看看这个类似的问题) 任何有一个像样的HT

我正在组装一个JSON API,它可能是也可能不是用 轨道。我希望能够验证JSON API是否按照 通过从一个只通过 HTTP

例如,测试客户端将向服务器上的给定URL发送请求 测试服务器,然后验证响应是否为JSON字符串 符合规范的要求。响应也可以是HTTP 响应代码,如401

我目前正在使用QUnit和jQuery.ajax运行测试。它是有效的,但是 我想知道是否有更好的选择。还有其他人做过吗 像这样的


谢谢

似乎有些人已经在黄瓜上找到了成功的方法(看看这个类似的问题)


任何有一个像样的HTTP库和JSON库的语言都应该这样做。只要选择你最喜欢的语言和测试框架就可以了。我可能会使用和,特别是如果API将在Ruby中实现,但口味会有所不同


编辑:您提到希望在服务器外部运行测试。如果您对此有把握,请使用例如代替Rack::Test。

我完全同意@mpartel

您可能需要一组单元测试(没有HTTP的复杂性)来测试实现的逻辑。一旦你走上这条路,你会发现用同一种语言编写测试会有好处


例如,若您在Rails中编写它(并使用Rack::Test),您还可以在一个更简单的Test::unit(或RSpec)环境中对很多情况进行单元测试

describe PersonApiController 
  # GET /person/1.json
  it "should respond with a person" do 
     person = Person.create(:name => "scott")
     get :show, :id => person.id, :format => 'json'
     response.should be_success
     response.body.should have_selector('name', :content => person.name)
  end
end 
如果你想变得更有趣,你可以通过一个插件/gem在你的客户端代码和服务器代码之间共享一个api客户端,然后使用类似json的代码初始化它

person_client = PersonClient.new(response.body)
person_client.name.should eql 'scott'

只需使用Cucumber和/或RSpec编写一些规范,即可连接到应用程序并测试输出。无需将JQuery拖到其中。

通常API是常规的控制器/操作。因此,您可以作为服务器应用程序中的常规控制器来测试此操作。这就像我测试我的API操作:

描述Api::AccountsController do
描述“GET:index”do
它“应该是成功的”吗
你明白吗
回答:你应该成功吗
结束
它“应该返回帐户列表”吗
5.时报{工厂:账户}
你明白吗
JSON.parse(response.body).size.should==5
结束
它“应该返回每个帐户的id、名称和描述”吗
帐户=工厂:帐户
你明白吗
result=JSON.parse(response.body).first
结果['account']['id']。应==account.id
结果['account']['name']。应==account.name
结果['account']['description']。应==account.description
结束
你得到什么
get:index,:format=>:json
结束
结束
结束


功能测试工具

查看python请求库。我就是为了这个目的而使用它的,它太棒了


我为Rails开发了一个JSAPI,并使用QUnitjQuery构建了一整套测试。我对最终结果非常满意,我的目标是彻底测试API,这种工具组合就是我所需要的一切


我一直在做一个新项目,它使用了茉莉花(Jasmine),在编写测试的方式上更具描述性(这让业务分析师感到高兴),但最终结果与QUnit基本相同。

我做到了!这是如何使用vanillarrails实现的。请注意不同的accept mime类型。如果愿意,您可以解析JSON。作为字符串进行比较就足够了

  test "vote comment up" do
    # @request.headers["Content-Type"] = "application/json"
    @request.headers["Accept"] = "application/javascript"
    post :up, {post_id: 1, id: 1}, {user_id: 5}
    assert_response :success
    assert_equal @response.body, '{"error":true,"errorPath":"/users/5/balance","userVotes":1,"totalVotes":0}'
  end

如果您想在开发过程中进行测试,我使用。

控制器测试。用黄瓜代替。对于面向用户的东西,不。控制器测试显然做了错误的事情,应该完全避免。对于API的东西来说,这是一个边界。在软件开发方面很少是一个意见问题。请注意我的资质。对于API来说,这是一个边界。我们可能没有使用Rails。该解决方案需要通过HTTP进行通信,并且不受服务器框架的影响。对于这种情况(或几乎任何其他情况),单元是错误的工具,因为它鼓励测试实现而不是行为。解决方案需要通过HTTP进行通信,并且与服务器框架无关。这太棒了。谢谢。在选择语言或框架之前,我们正试图通过一系列测试收集需求。在我们进行测试/需求之前,我们不知道在框架中寻找什么。好的评论,完全正确。任何测试框架都应该很容易支持这一点。我还建议将测试放在一个插件中,该插件可以包含在API代码库中,这样当您只签出API代码库时,您就可以更轻松地运行它们。您有这样的示例吗?您需要什么示例?只需使用Capybara或Rack::Test来
访问
发布
到相应的URL,然后调用
JSON.parse page.driver.response.body
或类似的方法并测试结果。我们试图在选择语言或框架之前,将需求收集为一系列测试。在进行测试/需求之前,我们不知道在框架中寻找什么。通常我将api作为代码库的一部分进行测试-这是有充分理由的,比如:api代码库具有文档测试;错误显示在进行重构后运行测试套件;通过测试更容易跟踪问题;它们作为持续集成的一部分运行。