ruby-on-rails - 在编写 Rails Controller 测试时,为什么使用#post vs #get vs #delete?

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

我意识到我不明白为什么 Rails Controller 测试/规范的结构是这样的。

在编写 Controller 测试时,我们被鼓励或多或少地将 Controller 视为一个单元并相应地编写单元测试,只关心 Controller 的输入和输出。例如,我们设置数据库的特定状态,也许 stub 一些 Devise 方法来模拟用户登录,当我们调用 post :create 或其他任何方法时,我们附加发送的参数的散列到那个 Controller Action 。

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

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

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

出于好奇,我采用了我的一个 Controller 规范并切换了所有这些方法,最终得到了诸如 delete :showget :create 之类的东西。 没有损坏。所以我很困惑:如果这些方法与我们在 Controller 规范中测试的代码没有相关细节,为什么我们要区分这些方法?

最佳答案

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

如今,您很少看到它(谢天谢地),但它仍然受到支持。因此,通过将 HTTP 方法放入测试中,您可以确保 request 对象的行为符合您在 Controller 操作中的预期方式。

关于ruby-on-rails - 在编写 Rails Controller 测试时,为什么使用#post vs #get vs #delete?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28289921/

相关文章:

file - 测试来自 `ls/dev` 的字符串并只回显 block 文件

ruby-on-rails - 按数据属性查找元素

laravel - 测试用例在通过测试用例上传文件时删除原始文件

c# - SpecFlow 功能可以在步骤之间共享吗?

ios - 在 View 顶部呈现新的半透明 VC

JAVA FX : Can I access objects instantiated in main from any controller?

Magento 扩展核心管理 Controller

ruby-on-rails - Rails - text_field_tag ---- 设置 tabindex?

ruby-on-rails - AcitveRecord 不会接受_nested_attributes_for 具有嵌套现有记录的新关联记录

ruby-on-rails - Sass::SyntaxError:找不到或无法读取要导入的文件:bootstrap-sprockets