【发布时间】:2013-07-16 16:04:01
【问题描述】:
我有一个before_filter,它检查传入的params 是否正确。如果传递了额外的参数或缺少必需的参数,它会立即使用 RABL 呈现 JSON 错误(它是一个 API 应用程序)。
为此,我的错误捕获函数中有以下两行:
json = render_to_string(template: 'errors/error')
render :json => json, :status => status
我正在尝试使用rspec 测试在before_filter 回调中调用的参数验证方法。
现在 rspec 呈现一个空模板。一旦我在我的测试中调用验证方法,这会立即在我的控制器中引发错误,如下所示:controller.validate_json(params, [:amount], nil, nil),因为validate_json 方法使用了一些 JSON 解析,它在空字符串上失败。
要解决这个问题,我需要在rspec 中调用render_views。当我这样做时,我会收到一个非常奇怪的长错误,如下所示:
RuntimeError:
ActionController::RackDelegation#status=....
基本上是 ActionController 对象。它所说的只是RuntimeError。它没有说明它是什么类型的错误或任何东西。此行的错误:
render :json => json, :status => status
我还能如何在控制器中测试模板?我知道我可能需要对视图和控制器进行两种不同的测试,但我没有 HTML 视图,而是所有 JSON 视图,以 RABL 呈现。如果不使用render_views,那么我将无法测试控制器,因为测试控制器的一部分是看到它返回了正确的状态以及正确的 JSON。此外,validate_json 方法将在空 JSON 上失败(由于空字符串 JSON 解析),因此,我无法真正单独测试和控制器。
【问题讨论】:
-
因此您直接调用该方法,而不是对某个操作执行
get并查看响应 -
validate_json不是一个动作。它是控制器中验证传入参数的辅助方法。它在控制器中的原因是我可以调用 render 如您在上面看到的。如果它是一个库,那么我无法访问渲染和其他特定于控制器的功能,因此我无法渲染渲染(如我的问题中所示)。或者那不是合适的地方吗? -
这是正确的地方。但你不应该直接在控制器测试中调用它!您将调用之前过滤器配置为运行的操作并检查这些结果
标签: ruby-on-rails ruby testing rspec rabl