31

在对这个问题进行了相当深入的研究之后,我在对文档的理解和结果之间陷入了僵局。

根据https://www.relishapp.com/rspec/rspec-rails/v/2-8/docs/routing-specs/route-to-matcher,我们应该能够编写以下内容:

#rspec-rails (2.8.1)
#rspec (>= 1.3.1)
#rspec-core (~> 2.8.0)

# routing spec
require "spec_helper"

describe BusinessUsersController do
  describe "routing" do
    it "routes to some external url" do
      get("/business_users/7/external_url").should route_to("http://www.google.com")
    end
  end
end

# routes.rb
BizeebeeBilling::Application.routes.draw do

  resources :business_users do
    member do
      get "external_url" => redirect("http://www.google.com")
    end
  end
end

运行此规范会产生以下结果: 失败:

  1) BusinessUsersController routing routes to some external url
     Failure/Error: assert_routing "/business_users/7/external_url", "http://www.google.com"
     ActionController::RoutingError:
       No route matches "/business_users/7/external_url"
     # ./spec/routing/business_users_routing_spec.rb:19:in `block (3 levels) in <top (required)>'

我无法在任何地方找到任何人报告此特定问题。

添加了详细信息:手动测试时,路线得到了很好的解决。

4

5 回答 5

50

路由规范/测试专门测试路由是否映射到特定的控制器和操作(可能还有一些参数)。

我深入研究了 Rails 和 Journey 的内部结构。RSpec 和 Rails(基本上省略了一些细节)Rails.application.routes.recognize_path用来回答“这是可路由的吗?”这个问题。

例如:

$ 导轨控制台
> Rails.application.routes.recognize_path("/business_users/1", 方法:"GET")
 => {:action=>"show", :controller=>"business_users", :id=>"1"}

但是, . 的另一端没有控制器/business_users/1/external_url。事实上,为了执行重定向,Rails 创建了一个 的实例ActionDispatch::Routing::Redirect,它是一个小型 Rack 应用程序。从来没有碰过 Rails 控制器。您基本上是在安装另一个 Rack 应用程序来执行重定向。

要测试重定向,我建议改用请求规范(中的文件spec/requests)。就像是:

require "spec_helper"

describe "external redirection" do
  it "redirects to google.com" do
    get "/business_users/1/external_url"
    response.should redirect_to("http://www.google.com")
  end
end

这会隐式测试路由,并允许您针对重定向进行测试。

于 2012-06-01T04:26:59.980 回答
25

安迪林德曼有正确的答案。但是,您不必将规范放在规范/请求中,您可以将其保留在规范/路由中,并明确使用元数据“类型”:describe 'my route', type: :request do

于 2012-06-01T07:59:25.420 回答
8

我遇到了类似的情况,我试图测试一系列路线,有些应该重定向,有些不应该。我想将它们保留在一个路由规范中,因为这是对它们进行分组的最合乎逻辑的方式。

我尝试使用describe: 'my route', type: request,但发现不起作用。但是,您可以RSpec::Rails::RequestExampleGroup在规范上下文中包含对请求规范方法的访问权限。就像是:

describe "My Routes" do
  context "Don't Redirect" do
    it "gets URL that doesn't redirect" do
      get("business_users/internal_url").should route_to(controller: "business_users", action: "internal_url_action")
    end
  end

  context "Redirection" do
    include RSpec::Rails::RequestExampleGroup
    it "redirects to google.com" do
      get "/business_users/1/external_url"
      response.should redirect_to("http://www.google.com")
    end
  end
end
于 2016-04-16T00:32:27.083 回答
-1

测试外部重定向的最简单方法是使用集成测试:

  test "GET /my_page redirects Google" do
    get "/my_page"
    assert_redirected_to "https://google.com"
  end

您的测试需要位于您的test/integration目录或集成测试所在的等效目录下。

于 2018-02-21T23:45:55.113 回答
-3

我认为您想要redirect_to 匹配器

于 2012-05-31T23:24:48.523 回答