【问题标题】:What to test in Rails routing?在 Rails 路由中测试什么?
【发布时间】:2013-08-07 19:46:31
【问题描述】:

我很好奇人们认为对路线进行充分/彻底的测试。与我一起工作的一个人似乎想在我们的路由文件中声明 每一个 路由,无论它多么标准。我觉得这是在浪费时间,但也许我错了,我不知道这有一些价值。

在某些情况下,我可以在路由中看到一些价值。我们仍然有一些动作可以同时响应 GET 和 POST 请求,尽管我一直想摆脱这些。我们对 lambdas 或任何东西没有任何疯狂的约束,但如果我们这样做似乎值得测试。

但是对于正常的资源定义?

resources :foo, only: [:index, :show]

我们断言这两个路由都存在,我们断言它们是 GET 并且它们转到正确的控制器/动作。这有什么意义吗?感觉我们现在只是在测试 Rails。

在一个稍微相关的问题上,我更喜欢像上面那样定义资源路由(使用only: [:index, :show] 部分)。如果该控制器上只有索引/显示操作,那么只在路由文件中定义 resources :foo 有什么后果吗?

在我看来,它可能只是使用了更多的时间和/或内存,但这是否也是一个安全问题或我不知道的非常糟糕的事情?

【问题讨论】:

  • 查看它的一种方式是,您正在测试 /foo/index 和 /foo/:id 以避免在没有意识到的情况下意外搞砸路由文件...谁 有没有不小心整件事?
  • 你还应该断言 true == true...
  • @bratsche 仅供参考:我也必须为testing unassigned routes 找到解决方案。

标签: ruby-on-rails rails-routing


【解决方案1】:

测试路由的最大原因不是双重测试 Rails,而是验证面向公众的 API。

这减少了针对广告入口点的回归,无论它们获取或返回的数据如何。

在什么级别测试这些也是有争议的;测试路线本身是否有价值,还是仅验证数据输入/输出才有意义?这样做测试相同的路线,我认为更有价值 - 但速度较慢。

我倾向于只在以下情况下直接测试路线:

  • 它们有点时髦,例如,不是沼泽标准路线
  • 必须拒绝一些路线
  • 在初步开发期间。

初步路线测试通常会在以其他方式进行测试后被删除。

【讨论】:

  • 您能解释一下第二点,当您必须拒绝某些路线时?你的意思是你明确地测试了某个路由不存在吗?
  • 什么是面向公众的 API?
  • @JohnCalebOsborne 一个供公众使用的 API。与不需要显式测试的内部 API 不同,它们将通过使用它们的任何东西进行测试。
【解决方案2】:

我测试路线以确保我想要允许的路线是开放的,但也让我想要关闭的路线不起作用。我将路由规范分为三个上下文 - 允许的路由、不允许的路由和自定义路由。

例如使用 rspec

describe SessionsController do
  describe "routing" do
    context "permitted" do
      it "routes to #create" do

        expect(post "sessions").to route_to("sessions#create")

      end
      ...
    end
    context "custom routes" do
      it "routes 'login' to #new" do

        expect(get "/login").to route_to("sessions#new")

      end
      ...
    end
    context "invalid routes" do
      it "does not route to #edit" do

        expect(get "/sessions/edit").not_to be_routable

      end
      ...
    end
  end
end

【讨论】:

  • 你能解释第三个“无效路由”上下文的目的吗?这是我问题的第二部分,有点相关。但是,如果您有“资源:会话”(并且您不包含“唯一”子句),并且您也没有 SessionsController#edit 方法..会发生什么?我从不这样做,但我只是好奇是否会出现任何巨大(如安全)问题。
  • 无论如何,对我来说,目的是确保我没有留下任何我没有计划的路线。我认为最好避免通过我没有明确打开的应用程序暴露任何路径。当我在做 TDD 时,我只包含我在后面编写代码的路由(使用 :only)。因此,我希望阻止任何其他路线,并且我希望我的测试告诉我情况就是这样。这也意味着我不能在不破坏测试的情况下意外更改路由文件。一个更好的例子是 users#index 不应该路由,我不希望它暴露。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
相关资源
最近更新 更多