如何从Ruby on RailsfunctiontestingtestingJSON结果?

我怎样才能断言我的Ajax请求,并从Ruby on RailsfunctiontestingtestingJSON输出?

使用JSON gem的JSON.parse,它接受一个string作为input,并返回一个JSON代表的Ruby散列。

这是一个testing的基本要点:

user = JSON.parse(@response.body) assert_equal "Mike", user['name'] 

这里是gem的文档: http : //json.rubyforge.org/ 。 另外,你可以很容易的使用IRB中的JSON gem。

Rails内置了JSON支持:

 def json_response ActiveSupport::JSON.decode @response.body end 

不需要插件

那么你可以做这样的事情:

 assert_equal "Mike", json_response['name'] 

如果你使用RSpec, json_spec值得一看

https://github.com/collectiveidea/json_spec

另外对于简短的JSON响应,您可以简单地将JSONstring与@ response.body进行匹配。 这可以防止必须依靠另一个gem。

 assert_equal '{"total_votes":1}', @response.body 

其实,你可以隐式使用JSON模块:

 assert_equal assigns(:user).to_json, @response.body 

如上所述,您使用JSON.parse来testingJSON,但是执行该断言取决于您如何呈现JSON。

如果您在控制器中生成JSON,则可以在控制器functiontesting中parsingJSON(如显示其他答案)。 如果您正在渲染JSON,并使用Jbuilder , rabl或采用此方法的其他gem来查看视图 ,则在视图单元中parsingJSON不会testing控制器functiontesting。 unit testing通常执行起来更快,而且写起来更容易 – 例如,你可以在内存中构build模型,而不是在数据库中创build模型。

没有一个答案提供了一个很好的维护方法来validationJSON响应。 我觉得这是最好的:

https://github.com/ruby-json-schema/json-schema

它为标准的json模式提供了一个很好的实现

你可以写一个模式,如:

 schema = { "type"=>"object", "required" => ["a"], "properties" => { "a" => { "type" => "integer", "default" => 42 }, "b" => { "type" => "object", "properties" => { "x" => { "type" => "integer" } } } } } 

并使用它: JSON::Validator.validate(schema, { "a" => 5 })

最好的方法来validation它对我的Android客户端实现。

你可以使用AssertJson gem来创build一个很好的DSL,它允许你检查你的JSON响应中应该存在的键和值。

将gem添加到您的Gemfile

 group :test do gem 'assert_json' end 

这是一个简单的例子,你的function/控制器testing看起来是什么样的(这个例子是从自述文件中改写的 ):

 class ExampleControllerTest < ActionController::TestCase include AssertJson def test_my_action get :my_action, :format => 'json' # => @response.body= '{"key":[{"inner_key":"value1"}]}' assert_json(@response.body) do has 'key' do has 'inner_key', 'value1' end has_not 'key_not_included' end end end 

您只需在testing中包含AssertJson模块并使用assert_json块,您可以在其中检查响应是否存在和不存在的键和值。 提示:它不是立即在自述文件中可见,而是检查一个值(例如,如果你的动作只是返回一个string数组),你可以做

  def test_my_action get :my_action, :format => 'json' # => @response.body= '["value1", "value2"]' assert_json(@response.body) do has 'value1' has 'value2' has_not 'value3' end end