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


113

Rspec的功能规格请求规格之间在概念上有什么区别?

从功能规格文档中:

功能规格是高级测试,旨在通过应用程序行使功能性。他们应该仅通过外部接口(通常是网页)来驱动应用程序。

对于要求规格:

请求规范为Rails的集成测试提供了一个精简的包装,并旨在在整个协议栈中推动行为,包括路由(由Rails提供)而无需进行存根(取决于您)。通过请求规范,您可以:

  • 指定一个请求
  • 在多个控制器之间指定多个请求
  • 在多个会话中指定多个请求

我知道功能规格使用Capybara,而请求规格则不使用。但这几乎不值得采用不同的概念。

Answers:


147

概念上的差异是您通常在测试用户故事,并且所有交互都应通过用户界面来驱动。那就是Capybara的用武之地。一个请求规范仍在测试您的应用程序的行为,并且不期望验收测试具有可读性。因此,具有用于验收测试的改进语法的功能。

技术差异包括请求规范包装了Rails集成测试,而功能规范则没有。这意味着根据请求规范,您可以使用get,post,put,delete和assert来响应响应。使用功能规范,您应该通过浏览器推动所有交互,并使用诸如访问和针对页面断言之类的方法。

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


2
那么,您会建议同时使用功能和要求规范,还是一个或另一个就足够了?(是TDD的
新手

2
我同时使用@robertwbradford。我使用功能规格来推动测试的进行-测试用户体验,然后使用单元测试构建功能。我使用请求功能用于测试响应-例如在sessions_spec我可以具有描述"GET /login"在块与预期it块,例如expect(response.status).to eq(200)expect(response).to render_template(:new),或在一个describe "POST /sessions",一个context "with valid credentials"块,与expect(response).to redirect_to(user)follow_redirect!; expect(response.body).to include("Signed in")
理查德约旦

5
而且您也使用控制器规格吗?在请求规范中测试的内容与在控制器规范中通常测试的内容之间似乎有些重复。
埃内斯托

5
话虽如此,上面的链接文章清楚地描述了这些差异。使用请求规范通过API进行测试,使用功能规范通过前端进行测试。
Damien Roche 2014年

2
@RichardJordan:一个问题:在功能规格中,您是否建议使用Rails路径(即visit users_path)或硬编码的字符串(visit '/users')?就个人而言,我不希望在那种规格中使用任何应用程序内部。
tokland 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.