RSpec:功能和请求规范之间有什么区别?

har*_*arm 111 rspec ruby-on-rails rspec-rails

Rspec的功能规格请求规范之间的概念差异是什么?

从功能规范文档:

功能规范是用于通过应用程序执行功能切片的高级测试.他们应该只通过其外部接口(通常是网页)来驱动应用程序.

并根据要求规格:

请求规范提供了一个围绕Rails集成测试的瘦包装器,旨在通过完整堆栈驱动行为,包括路由(由Rails提供)而不是存根(由您决定).根据请求规范,您可以:

  • 指定单个请求
  • 跨多个控制器指定多个请求
  • 在多个会话中指定多个请求

我知道功能规格使用Capybara并且请求规格没有.但这几乎不值得采用不同的概念.

Ric*_*dan 146

概念上的区别在于您通常会测试用户故事,并且所有交互都应该通过用户界面进行.这就是Capybara的用武之地.请求规范仍在测试应用程序的行为,并且没有接受测试可能具有的可读性的期望.因此,功能是用于验证验证的改进语法.

技术差异包括请求规范包装Rails集成测试,而功能规格则不包括.这意味着使用请求规范,您可以使用get,post,put,delete和assert方法来响应.使用功能规范,您应该通过浏览器驱动所有交互,并使用访问和断言等方法对页面进行操作.

我建议在github上的rspec-rails源代码中阅读feature_spec.feature.我希望这有帮助.

  • 你也使用控制器规格吗?您在请求规范中测试的内容与通常在控制器规范中测试的内容之间似乎存在一些重复. (5认同)
  • 话虽如此,以上链接文章清楚地描述了这些差异。使用请求规范通过API进行测试,使用功能规范通过前端进行测试。 (4认同)
  • 那么你会建议使用功能和请求规格,还是一个或另一个足够?(成为TDD新手......) (2认同)
  • 我同时使用了两个,@ robertwbradford.我使用功能规范在测试中驱动我的外部 - 测试用户体验,然后使用单元测试构建功能.我使用请求规范来测试响应 - 例如在sessions_spec中我可能有一个描述`"GET/login"`块,在`it`块中具有期望值,例如`expect(response.status).to eq(200)`和` expect(响应).to render_template(:new)`,或者``描述'POST/sessions"`,一个带有有效凭据的`上下文"`block,带有'expect(response).to redirect_to(user)`和`follow_redirect !; expect(response.body).to include("签名")` (2认同)
  • @RichardJordan:一个问题:在功能规格中,您是否建议使用Rails路径(即“ visit users_path”)或硬编码字符串(“ visit'/ users”)?就个人而言,我不希望在那种规格中使用任何应用程序内部。 (2认同)