0

我意识到我不明白为什么 Rails 控制器测试/规范按照它们的方式构建的基本原理。

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

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

控制器只是一个 Ruby 类,它的公共方法被调用来执行各种 RESTful 操作。所以在控制器规范中,我们不加载像/kittens/new;这样的 URL。相反,我们直接调用控制器动作,例如get :new. 路线不应该是相关的;它们只是系统的另一部分,它决定为给定请求调用哪个控制器操作。

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

delete :show出于好奇,我采用了我的控制器规格之一,并切换了所有这些方法,最终得到了和之类的东西get :create什么都没坏。所以我非常困惑:如果这些方法与我们在控制器规范中测试的代码无关,我们为什么要区分这些方法?

4

2 回答 2

1

我不确定这是否就是它仍然存在的原因,但是在 REST 之前,许多应用程序使用相同的端点用于newcreate. (例如,您可能有一个带有new_review操作的控制器,如果您用 打它GET,它会显示评论表单,如果您用 打它POST,它会保存评论。)在这些控制器操作中,您会看到的if request.post?

如今,您看到这种情况的频率要少得多(谢天谢地),但它仍然受到支持。因此,通过将 HTTP 方法放入您的测试中,您可以确保request对象的行为方式符合您在控制器操作中的预期。

于 2015-02-05T04:34:54.237 回答
0

总结在这里(REST API - 为什么使用 PUT DELETE POST GET?

REST 是一种有意义的数据访问方法。当您在 REST 中看到请求时,应该立即清楚数据发生了什么。

因此,您在 HTTP 动词前加上旨在导致调用您的操作的前缀。

这很重要,因为对于不使用任何 7 个默认控制器操作的场景。例如,disable_accounts我们是在建议GET /disabled_accounts还是PATCH /disabled_accounts

于 2015-02-03T02:28:53.300 回答