我意识到我不明白为什么Rails控制器测试/规格的结构与它们的结构相同。
在编写控制器测试时,我们鼓励或多或少地将控制器视为一个单元并相应地编写单元测试,仅关注控制器的输入和输出。例如,我们设置数据库的某个状态,并且可能存根一些Devise方法来模拟登录的用户,当我们调用post :create
或其他什么时,我们会附加一个发送到该控制器操作的params的哈希值。
然后,对于输出,我们查看数据库的结果状态,检查响应HTTP代码和重定向等,以及将传递给模板呈现过程的任何已分配变量。
控制器只是一个Ruby类,其公共方法被调用以执行各种RESTful操作。因此,在控制器规范中,我们不会加载/kittens/new
之类的网址;相反,我们直接调用控制器操作,如get :new
。路线不应该是相关的;它们只是系统的另一部分,用于决定为给定请求调用哪个控制器操作。
那么为什么在调用控制器操作时我们必须指定HTTP方法(如get
,post
,put
,delete
)?这不是外部细节,是路由工作的一部分吗?
出于好奇,我采用了我的一个控制器规范并切换了所有这些方法,最终得到delete :show
和get :create
之类的内容。 没有什么破坏。所以我完全感到困惑:为什么我们要区分这些方法,如果它们与我们在控制器规范中测试的代码不相关?
答案 0 :(得分:1)
我不确定这是否仍然存在,但是在REST之前,许多应用使用new
和create
的相同端点。 (例如,您可能有一个new_review
操作的控制器,如果您使用GET
点击它,它会显示评论表单,如果您使用POST
点击它,它会保存评论。)在这些控制器操作中,您会看到if request.post?
。
如今,你看到的情况要少得多(谢天谢地),但它仍然受到支持。因此,通过在测试中使用HTTP方法,可以确保request
对象的行为与您在控制器操作中的预期方式相同。
答案 1 :(得分:0)
总结一下(REST API - why use PUT DELETE POST GET?)
REST是一种有意义的数据访问方法。当你看到一个 在REST中请求,它应该立即显示正在发生的事情 与数据。
因此,您在HTTP动词前面打算调用您的动作。
这很重要,因为对于不使用任何7个默认控制器操作的方案。例如,disable_accounts
,我们建议GET /disabled_accounts
或PATCH /disabled_accounts
?