Jak*_*old 6 ruby rspec ruby-on-rails rspec2 ruby-on-rails-3
tl; dr:跳转到最后一段
最近我一直在尝试使用RSpec的请求规范来进行更有针对性的测试.
这是我的测试主要看起来的方式:
User#upvote(comment)问题是,当我有一些特定的场景导致错误时,一切似乎都在模型/视图层中工作,我无法重现它.
这迫使我写一个集成测试,我也可以用黄瓜做.一旦我能够实际重现它,问题就出现了,我需要弄清楚它为什么会发生.这通常意味着在测试中玩耍,改变不同的东西,看看会发生什么.
例如,创建一个注释,该注释由尝试upvote的用户拥有,尝试使用过期的会话进行投票等.但是这些在Cucumber中编写真的很痛苦,因为需要编写一个场景然后指定每个步骤.
在这一点上,我更喜欢写一个请求规范,因为它更低级别并允许我直接做东西.问题是,我不确定如何正确编写请求规范,或者规则是什么.
这里有一个简单的例子:
visit login_path
fill_in "Username", :with => user.username
fill_in "Password", :with => user.password
click_button "Log in"
Run Code Online (Sandbox Code Playgroud)
VS
post sessions_path(:username => user.username, :password => user.password)
Run Code Online (Sandbox Code Playgroud)
甚至更低级的东西
session[:user_id] = user.id # this actually doesn't work, but the idea is there
Run Code Online (Sandbox Code Playgroud)
这两个例子都实现了同样的目的,它们会记录用户.我知道选择哪一个的答案是基于我需要测试的内容,但这并不能回答正确,传统的方法来做到这一点.
我一直试图找到有关请求规格的内容,但它们并没有真正描述过任何地方.RSpec书籍没有涵盖它们,RSpec文档也没有说明.
编写请求规范的正确方法是什么?什么时候我应该使用水豚,只使用Rails' #get和#post方法而不是单击按钮和visit路径?
对于请求规范,我认为惯例是坚持测试用户行为和界面交互,这意味着加载页面、填写表单等。网站用户无法直接设置会话或与变量交互,因此您的请求规范也不应该。
我经常想通过在请求规范中发布或设置变量来跳过页面加载和表单交互(为了速度,尤其是繁重的 ajax 规范),但这确实破坏了请求规范的目的。
正如评论中提到的,您应该测试其他规范类型中的特定控制器/视图行为。
| 归档时间: |
|
| 查看次数: |
2807 次 |
| 最近记录: |