我意识到我不明白为什么 Rails 控制器测试/规范按照它们的方式构建的基本原理。
在编写控制器测试时,我们鼓励或多或少地将控制器视为一个单元并相应地编写单元测试,只关心控制器的输入和输出。例如,我们设置了数据库的某种状态,并可能存根一些 Devise 方法来模拟用户登录,当我们调用post :create
或其他什么时,我们附加一个发送到该控制器操作的参数散列。
然后,对于输出,我们查看数据库的结果状态,我们检查响应 HTTP 代码和重定向等,以及将传递给模板渲染过程的任何已分配变量。
控制器只是一个 Ruby 类,它的公共方法被调用来执行各种 RESTful 操作。所以在控制器规范中,我们不加载像/kittens/new
;这样的 URL。相反,我们直接调用控制器动作,例如get :new
. 路线不应该是相关的;它们只是系统的另一部分,它决定为给定请求调用哪个控制器操作。
那么为什么我们在调用控制器动作时必须指定 HTTP 方法(如get
, post
, put
, )?delete
这不是外部细节,是路由工作原理的一部分吗?
delete :show
出于好奇,我采用了我的控制器规格之一,并切换了所有这些方法,最终得到了和之类的东西get :create
。什么都没坏。所以我非常困惑:如果这些方法与我们在控制器规范中测试的代码无关,我们为什么要区分这些方法?