控制器规范和请求规范有什么区别?

51

我正在开发一个Rails API,现在计划为控制器编写一些RSpec测试。我查阅了一些资料,但并没有弄清楚控制器规范(controller specs)和请求规范(request specs)之间的实际区别,以及在测试API时应该使用哪个。


3
如果我是你,我会放弃控制器规范,转而采用请求/集成规范。 - Sergio Tulentsev
2
如果有人阅读上面的评论并想知道“为什么要请求/集成规范而不是控制器规范?”,我在这里写了一篇文章(https://www.codewithjason.com/use-controller-request-specs-rails-dont/)。 - Jason Swett
3个回答

45

事实上,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所做的工作。


34

Rails 3 & 4

控制器测试 - 控制器测试是一个对Rails功能测试的RSpec封装。它允许您在每个示例中模拟单个HTTP请求,然后指定期望的结果。

请求测试 - 请求测试提供了一个轻量级的包装器,用于Rails集成测试,并旨在通过完整堆栈驱动行为,包括路由(由Rails提供)和无需存根(这取决于您)。

因此,如果要测试API控制器,则建议使用控制器测试,因为您正在测试单个请求。


Rails 5+

Rails 5提高了请求测试的速度和现实性,比起Rails版本4的控制器和请求测试。 Rails团队和RSpec核心团队的官方建议是改用请求测试(而不是控制器测试)


5
如果你使用的是旧版本的Rails,那么通常推荐的代码风格似乎是面向控制器规范。Rails 5已经改变了控制器测试的工作方式;它们是集成测试,你不能再访问控制器的内部。现在我不确定是否有必要进行控制器测试了。请求和特性规范似乎是未来开发的推荐方法。https://everydayrails.com/2016/09/05/replace-rspec-controller-tests.html - CJBrew
我有一个问题,关于是否通过直接调用操作而不使用http层来单元测试控制器。这是推荐的吗? - Jwan622

10

引用 Aaron Sumner 的话:

Rails 和 RSpec 团队都建议替换或移除您应用程序的控制器测试(也称为功能测试层),而是更倾向于直接测试模型(单元)或使用更高级别的集成测试。

对于一个新的 API,我更喜欢使用请求规范来访问我的“端点”(也就是模型和业务逻辑),而不是使用控制器测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接