新手问题 关于 RSpec 测试

fan124 · 2017年04月18日 · 最后由 Rei 回复于 2017年04月19日 · 2440 次阅读

我刚开始学 RSpec 写测试,我发现 spec 目录下有好多目录,我从网上找资料发现, 从 Rails 5 和 RSpec 3.5 开始,不建议做 controller 的测试,而是做 feature 和 request 的测试

  • controllers
  • features
  • helpers
  • mailers
  • models
  • requests
  • routing

这几个当中,我是不是可以不写 controllers,还有 features(用 Capybara 做)可以覆盖 requests 和 routing,所以这俩(requests,routing)是不是可以不做?

还没写就考虑哪些不写了?为啥不都试试?

我是写过的,只是觉得这几个 controllers,requests,routing,features 好像做重复的事情,是不是其中几个是不需要做的

fan124 #1 回复

我最近有写 request 测试,就是请求一个 api,就会到控制器,所以就包括 mvc,route 了。feature 不知道是什么。

chenge #2 回复

features 我是写了用 Capybara 的集成测试,我在想 requests 是不是完全代替 controllers,但是不用 assigns 和 assert_template,http://rspec.info/blog/2016/07/rspec-3-5-has-been-released/ 这儿的 Rails: Support for Rails 5 提到 request spec

跟着 Rails Default Stack 多好,现在你要选择了。

5 楼 已删除
Rei #4 回复

是指 Rails 自带的测试框架(MiniTest?)吗,我可以试一下。

哎,不建议做controller的测试吗?前不久刚练习写controller的相关测试..

msl12 #7 回复

好像是不建议用 assigns 和 assert_template,但是如果 controller 里有逻辑需要测时,还是可以测,我对测试还是新手,你也可以参考这个 https://gitlab.com/gitlab-org/gitlab-ce/issues/23768

fan124 #6 回复

minitest 比 rspec 表述能力差很多

Rei #4 回复

选择有什么不好吗?为什么不让人选择?

fan124 #8 回复

原来如此呀

nouse #10 回复

好钢用在刀刃上,这不是应该费脑筋的地方。

Rei #4 回复

如果有(可能)比 Default Stack 更好的选择,为什么不用更好的呢?

而且 Default Stack 本身也一直在改变,比如 WebServer 之前用 Webrick 现在改用 Puma 了。

fan124 #8 回复

我个人倾向于把业务逻辑拆分到app/serviceapp/lib下,然后分开做模块的单元测试。主程序基本只考虑做request or feature测试,这样相对来说比较容易维护测试代码,因为细节的实现可能会经常改动,但是只要对外的行为不变就没问题。

msg7086 #13 回复

如果 default stack 不够用了,再找替代品。但我看过很多人换 Rspec 之前甚至没写过 Unit::Test。

Default Stack 的变更会提供平滑迁移方案,自己替换的会延迟、疼痛或没有方案。

Rei #15 回复

我的确没写过 Unit::Test,因为我学 Rails 的时候老大直接带着我们写 RSpec 了。

如果你的 controller 返回的是 html,那确实不应该测试,因为 html 和最终用户看到的并不一致,而且 js 交互也需要 acceptance 测试。

Rei #15 回复

楼主并没有说自己想写另一个 Basecamp,所以不应该推断楼主应该使用 default stack

rspec 的生态更好

Rspec 会鼓励写深层嵌套、抽象、魔幻的代码,简单事情复杂化,增加学习成本和维护难度。增加一个 Gem 不只是加几行代码,而是在应用中引入了一个理念,和原有理念融合或冲突,升级框架的时候成为依赖阻碍。

我希望有一天某个应用积重难返时,不要怪 Ruby 太魔幻、Rails 太重,然后希望在新语言新框架重新开始。代码是自己写的,这是自己选择的结果。

msg7086 #16 回复

已有项目就没办法了,遵循团队约定是最合适的。

Rails 5.1 出来写个人项目的时候可以试试 Default Stack,恰好这次更新对测试有改动。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号