如何从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值得一看
另外对于简短的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