Ruby on rails 如何测试JSON API?
我正在组装一个JSON API,它可能是也可能不是用 轨道。我希望能够验证JSON API是否按照 通过从一个只通过 HTTP 例如,测试客户端将向服务器上的给定URL发送请求 测试服务器,然后验证响应是否为JSON字符串 符合规范的要求。响应也可以是HTTP 响应代码,如401 我目前正在使用QUnit和jQuery.ajax运行测试。它是有效的,但是 我想知道是否有更好的选择。还有其他人做过吗 像这样的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
谢谢 似乎有些人已经在黄瓜上找到了成功的方法(看看这个类似的问题)
任何有一个像样的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,并使用QUnit和jQuery构建了一整套测试。我对最终结果非常满意,我的目标是彻底测试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代码库具有文档测试;错误显示在进行重构后运行测试套件;通过测试更容易跟踪问题;它们作为持续集成的一部分运行。