【问题标题】:How to test routes with Rspec 2 in Rails 3?如何在 Rails 3 中使用 Rspec 2 测试路线?
【发布时间】:2011-05-20 00:11:51
【问题描述】:

我找不到任何解释如何在 Rails 3 中测试路由的内容。即使在 Rspec 书中,也没有很好地解释。

谢谢

【问题讨论】:

标签: ruby-on-rails-3 rspec2


【解决方案1】:

rspec-rails Github site 上有一个简短的示例。您还可以使用脚手架生成器生成一些罐头示例。例如,

rails g scaffold Article

应该产生这样的东西:

require "spec_helper"

describe ArticlesController do
  describe "routing" do

    it "routes to #index" do
      get("/articles").should route_to("articles#index")
    end

    it "routes to #new" do
      get("/articles/new").should route_to("articles#new")
    end

    it "routes to #show" do
      get("/articles/1").should route_to("articles#show", :id => "1")
    end

    it "routes to #edit" do
      get("/articles/1/edit").should route_to("articles#edit", :id => "1")
    end

    it "routes to #create" do
      post("/articles").should route_to("articles#create")
    end

    it "routes to #update" do
      put("/articles/1").should route_to("articles#update", :id => "1")
    end

    it "routes to #destroy" do
      delete("/articles/1").should route_to("articles#destroy", :id => "1")
    end

  end
end

【讨论】:

  • 我对这些类型的测试有疑问,这是我的问题stackoverflow.com/questions/14330293/…,它几乎不会验证路由是否存在于 routes.rb 中,它只是与 syntanx 检查一起使用.有什么想法吗?
【解决方案2】:

Zetetic 的回答解释了如何测试路线。这个答案解释了为什么你不应该这样做。

一般来说,您的测试应该测试暴露给用户(或客户端对象)的行为,而不是提供该行为的实现。路由是面向用户的:当用户输入http://www.mysite.com/profile 时,他并不关心它是否转到ProfilesController;相反,他关心的是看到他的个人资料。

所以不要测试你将要使用 ProfilesController。相反,设置一个 Cucumber 场景来测试当用户转到 /profile 时,他会看到他的姓名和个人资料信息。这就是你所需要的。

再次重申:不要测试您的路线。测试你的行为。

【讨论】:

  • 如果谁反对这个会留下评论解释他们为什么这样做会很好......
  • 一般不会。单元测试在模型级别很有用——其中涉及内部业务逻辑(独立于 UI)。然而,在控制器级别,只有 UI 是相关的,因此测试控制器实现并不能告诉您任何有用的信息。如果有人告诉我必须在 Cucumber 故事和 RSpec 模型规格之间做出选择,我每次都会选择 Cucumber 故事。 (幸运的是,我不必选择。:))
  • 我不同意你的假设。可能有你想要测试路由的原因,你可能有带有约束的路由,你可能有动态创建的路由,返回机架应用程序的路由等。
  • @Agustin 是的。而且我认为这些都不会改变我的主张。如果我动态创建路由(无论如何这不是很好的做法),我不想测试它是否指向特定的控制器;相反,我想测试它是否到达了 UI 的特定部分。路线是给用户的。 UI是给用户的。控制器是实现。
  • 我正在开发的应用程序(客户端工作)有一个 routes.rb 文件,现在已经增长到 1042 行。不是很好,但这就是现实。很多嵌套路由,一些复杂的约束,一些部分遮蔽了后来声明的资源路由的路由。这肯定是一团糟,但有时我需要进入那里并更改或添加东西,在这种情况下,最好有一个测试来验证路线是否按预期工作。
猜你喜欢
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多