测试 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 中。我在我的控制器中做了一堆数学运算,但是当你传递(错误地)一个字符串而不是一个数字时,数学运算就不太好用了。

我的问题

继续深入研究 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