在编写Rails控制器测试时,为什么要使用#post vs #get vs #delete?

时间:2015-02-03 01:31:11

标签: ruby-on-rails testing controller rack-test

我意识到我不明白为什么Rails控制器测试/规格的结构与它们的结构相同。

在编写控制器测试时,我们鼓励或多或少地将控制器视为一个单元并相应地编写单元测试,仅关注控制器的输入和输出。例如,我们设置数据库的某个状态,并且可能存根一些Devise方法来模拟登录的用户,当我们调用post :create或其他什么时,我们会附加一个发送到该控制器操作的params的哈希值。

然后,对于输出,我们查看数据库的结果状态,检查响应HTTP代码和重定向等,以及将传递给模板呈现过程的任何已分配变量。

控制器只是一个Ruby类,其公共方法被调用以执行各种RESTful操作。因此,在控制器规范中,我们不会加载/kittens/new之类的网址;相反,我们直接调用控制器操作,如get :new。路线不应该是相关的;它们只是系统的另一部分,用于决定为给定请求调用哪个控制器操作。

那么为什么在调用控制器操作时我们必须指定HTTP方法(如getpostputdelete)?这不是外部细节,是路由工作的一部分吗?

出于好奇,我采用了我的一个控制器规范并切换了所有这些方法,最终得到delete :showget :create之类的内容。 没有什么破坏。所以我完全感到困惑:为什么我们要区分这些方法,如果它们与我们在控制器规范中测试的代码不相关?

2 个答案:

答案 0 :(得分:1)

我不确定这是否仍然存在,但是在REST之前,许多应用使用newcreate的相同端点。 (例如,您可能有一个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_accountsPATCH /disabled_accounts