RSpec:特性和请求规范有啥区别?
Posted
技术标签:
【中文标题】RSpec:特性和请求规范有啥区别?【英文标题】:RSpec: What is the difference between a feature and a request spec?RSpec:特性和请求规范有什么区别? 【发布时间】:2013-02-16 21:52:12 【问题描述】:Rspec 的feature specs 和request specs 的概念区别是什么?
来自功能规范文档:
功能规格是用于执行部分功能的高级测试 通过应用程序。他们应该仅通过其驱动应用程序 外部接口,通常是网页。
对于请求规格:
请求规范为 Rails 的集成测试提供了一个精简的包装,并且是 旨在通过整个堆栈驱动行为,包括路由 (由 Rails 提供)并且没有存根(这取决于您)。 使用请求规范,您可以:
指定单个请求 跨多个控制器指定多个请求 跨多个会话指定多个请求
我知道功能规范使用 Capybara 而请求规范不使用。但这几乎不值得不同的概念。
【问题讨论】:
【参考方案1】:概念上的区别在于您通常是在测试用户故事,并且所有交互都应该通过用户界面来驱动。这就是 Capybara 的用武之地。请求规范仍在测试您的应用程序的行为,并且没有接受测试所具有的可读性期望。因此,改进了验收测试语法的功能就在那里。
技术差异包括请求规范包含 Rails 集成测试,而功能规范不包含。这意味着通过请求规范,您可以针对响应使用 get、post、put、delete 和 assert 方法。使用功能规范,您应该通过浏览器驱动所有交互,并使用访问和断言页面等方法。
我建议阅读 github 上 rspec-rails 源代码中的 feature_spec.feature。我希望这会有所帮助。
【讨论】:
那么您会建议同时使用功能和请求规范,还是其中一种就足够了? (刚接触 TDD...) 我两个都用,@robertwbradford。我在测试中使用功能规范来推动我的外部体验——测试用户体验,然后使用单元测试构建功能。我使用请求规范来测试响应 - 例如在 session_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")
你也使用控制器规格吗?您在请求规范中测试的内容与通常在控制器规范中测试的内容之间似乎存在一些重复。
也就是说,上面链接的帖子清楚地描述了差异。使用请求规范通过 API 进行测试,使用特性规范通过前端进行测试。
@RichardJordan:一个问题:在功能规范中,您建议使用 Rails 路径(即visit users_path
)还是硬编码字符串(visit '/users'
)?就个人而言,我不喜欢在这类规范中使用任何应用程序内部。以上是关于RSpec:特性和请求规范有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
在 RSpec 请求规范中使用 Capybara 时设置自定义请求标头的最佳方法是啥?