测试 Rails 控制器和中间件 - 功能测试还是集成测试?
Testing Rails Controllers and Middleware- Functional vs. Integration testing?
背景
我有一个遗留的 Rails 3.2 应用程序,我正在将其从自主开发的测试解决方案转换为 rails 应用程序(当前为 MiniTest)。该应用程序是一个 JSON api,只有一个端点,因此此时测试非常简单。我们构建了一个(相对复杂的)json 有效载荷,然后对响应进行断言。
到目前为止我做了什么
旧的测试解决方案是通过线路(使用 HTTP gem)在单独的 运行ing 服务器实例上触发 HTTP 请求。 运行 它通过整个堆栈,包括中间件堆栈,最终达到 ActionDispatch::ParamsParser
,这使得 params
散列可用于控制器。
我将测试转换为 ActionController::TestCase
的子类,因此只有一个 rails 实例(测试实例)是 运行ning。然后我删除了 HTTP gem 以便我可以使用 ActionController::TestCase#post
方法发送 json 有效负载。这就是事情崩溃的地方
问题
似乎只有 rails 集成测试使用中间件堆栈,而功能测试更像是控制器的单元测试。因此,ActionController::TestCase#post
后面是 #paramify_values
method, which looks like it's mocking out the params hash with some logic that's like the logic in ParamsParser
但有一些差异。最重要的是,当我尝试在我的参数散列中发送一个浮点数时,它被转换为一个字符串。 ParamsParser 正确地将浮点数放在 params
中。我在我的控制器中做了一堆数学运算,但是当你传递(错误地)一个字符串而不是一个数字时,数学运算就不太好用了。
我的问题
- 有没有办法 运行 一个
ActionController::TestCase
与 rails 中间件堆栈处理事情?
- 我是否使用了错误的工具,应该改用
ActionDispatch::IntegrationTest
? ActionDispatch::IntegrationTest
rails 指南中的示例看起来像是为用户工作流制作的,更类似于 cucumber/capybara 脚本而不是触发单个请求。
继续深入研究 rails 源代码,很明显使用功能测试是错误 的做法。如果中间件堆栈很重要,我应该使用集成测试。
我相信this rails bug touches on the same sort of issues that I'm encountering, but it has gone stale, so I don't know what resolution there there might be. and it has been resolved for Rails 5, but not Rails 4。
背景
我有一个遗留的 Rails 3.2 应用程序,我正在将其从自主开发的测试解决方案转换为 rails 应用程序(当前为 MiniTest)。该应用程序是一个 JSON api,只有一个端点,因此此时测试非常简单。我们构建了一个(相对复杂的)json 有效载荷,然后对响应进行断言。
到目前为止我做了什么
旧的测试解决方案是通过线路(使用 HTTP gem)在单独的 运行ing 服务器实例上触发 HTTP 请求。 运行 它通过整个堆栈,包括中间件堆栈,最终达到 ActionDispatch::ParamsParser
,这使得 params
散列可用于控制器。
我将测试转换为 ActionController::TestCase
的子类,因此只有一个 rails 实例(测试实例)是 运行ning。然后我删除了 HTTP gem 以便我可以使用 ActionController::TestCase#post
方法发送 json 有效负载。这就是事情崩溃的地方
问题
似乎只有 rails 集成测试使用中间件堆栈,而功能测试更像是控制器的单元测试。因此,ActionController::TestCase#post
后面是 #paramify_values
method, which looks like it's mocking out the params hash with some logic that's like the logic in ParamsParser
但有一些差异。最重要的是,当我尝试在我的参数散列中发送一个浮点数时,它被转换为一个字符串。 ParamsParser 正确地将浮点数放在 params
中。我在我的控制器中做了一堆数学运算,但是当你传递(错误地)一个字符串而不是一个数字时,数学运算就不太好用了。
我的问题
- 有没有办法 运行 一个
ActionController::TestCase
与 rails 中间件堆栈处理事情? - 我是否使用了错误的工具,应该改用
ActionDispatch::IntegrationTest
?ActionDispatch::IntegrationTest
rails 指南中的示例看起来像是为用户工作流制作的,更类似于 cucumber/capybara 脚本而不是触发单个请求。
继续深入研究 rails 源代码,很明显使用功能测试是错误 的做法。如果中间件堆栈很重要,我应该使用集成测试。
我相信this rails bug touches on the same sort of issues that I'm encountering, but it has gone stale, so I don't know what resolution there there might be. and it has been resolved for Rails 5, but not Rails 4。