我正在开发一个Rails API,现在计划为控制器编写一些RSpec测试。我查阅了一些资料,但并没有弄清楚控制器规范(controller specs)和请求规范(request specs)之间的实际区别,以及在测试API时应该使用哪个。
我正在开发一个Rails API,现在计划为控制器编写一些RSpec测试。我查阅了一些资料,但并没有弄清楚控制器规范(controller specs)和请求规范(request specs)之间的实际区别,以及在测试API时应该使用哪个。
事实上,RSpec团队正式宣布控制器规范现已过时。
http://rspec.info/blog/2016/07/rspec-3-5-has-been-released/
对于新的Rails应用程序:我们不建议将rails-controller-testing gem添加到您的应用程序中。Rails团队和RSpec核心团队的官方建议是改用请求规范。请求规范允许您专注于单个控制器动作,但与控制器测试不同,它涉及路由器、中间件堆栈以及Rack请求和响应。这使得您编写的测试更加真实,并有助于避免控制器规范中常见的许多问题。在Rails 5中,请求规范比Rails 4中的请求或控制器规范要快得多,这要归功于Rails Committer Team的Eileen Uchitelle1所做的工作。
控制器测试 - 控制器测试是一个对Rails功能测试的RSpec封装。它允许您在每个示例中模拟单个HTTP请求,然后指定期望的结果。
请求测试 - 请求测试提供了一个轻量级的包装器,用于Rails集成测试,并旨在通过完整堆栈驱动行为,包括路由(由Rails提供)和无需存根(这取决于您)。
因此,如果要测试API控制器,则建议使用控制器测试
,因为您正在测试单个请求。
Rails 5提高了请求测试的速度和现实性,比起Rails版本4的控制器和请求测试。 Rails团队和RSpec核心团队的官方建议是改用请求测试(而不是控制器测试)。
引用 Aaron Sumner 的话:
Rails 和 RSpec 团队都建议替换或移除您应用程序的控制器测试(也称为功能测试层),而是更倾向于直接测试模型(单元)或使用更高级别的集成测试。
对于一个新的 API,我更喜欢使用请求规范来访问我的“端点”(也就是模型和业务逻辑),而不是使用控制器测试。