Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 路由规范支持重定向路由吗?[RSpec]_Ruby On Rails_Rspec - Fatal编程技术网

Ruby on rails 路由规范支持重定向路由吗?[RSpec]

Ruby on rails 路由规范支持重定向路由吗?[RSpec],ruby-on-rails,rspec,Ruby On Rails,Rspec,在对这个问题进行了相当深入的挖掘之后,我在对文档的理解和结果之间陷入了僵局 根据,我们应该能够写出以下内容: #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 exter

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

根据,我们应该能够写出以下内容:

#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)>'
1)BusinessUsersController路由到某个外部url
失败/错误:断言路由“/业务用户/7/外部url”http://www.google.com"
ActionController::路由错误:
没有路由匹配“/业务\用户/7/外部\ url”
#./spec/routing/business\u users\u routing\u spec.rb:19:in`block(3层)in'
我在任何地方都找不到任何人报告这一具体问题


添加的细节:手动测试时,路由问题得到了很好的解决。

我想您需要。

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

我深入研究了一下Rails的内部结构,并进行了一次旅行。RSpec和Rails(基本上,省略了一些细节)使用
Rails.application.routes.recognizer\u path
来回答“这是可路由的吗?”

例如:

$ rails console > Rails.application.routes.recognize_path("/business_users/1", method: "GET") => {:action=>"show", :controller=>"business_users", :id=>"1"}
这将隐式测试路由,并允许您针对重定向进行测试。

Andy Lindeman给出了正确答案。但是,您不必将规范放在规范/请求中,您可以将其放在规范/路由中,并使用元数据“type”显式显示:
描述“我的路由”,type::request do
我遇到了一个类似的情况,我试图测试一系列路由,有些路由应该重定向,有些不应该重定向。我想将它们保存在一个路由规范中,因为这是对它们进行分组的最合乎逻辑的方式

我尝试使用
描述:“我的路线”,键入:request
,但发现它不起作用。但是,您可以在规范上下文中包括
RSpec::Rails::RequestExampleGroup
,以获得对请求规范方法的访问。比如:

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
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

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

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

您的测试需要在您的
测试/集成
目录下或集成测试应该去的等效目录下。

路由规范中没有重定向到matcher的功能。此外,错误不在匹配器中,而是在运行测试时未拾取routes.rb中明确定义的路由。另外一点是,当手动测试时,路由本身工作得非常好。如果它不是控制器规范,那么为什么它以
描述BusinessUsersController
开头?你说得对。然而,这些都是产生的。我想这是一个完全不同的问题:(我试过了,但是仍然没有在spec的上下文中找到响应对象。在对它进行了一点修改之后,rspec似乎不允许我覆盖spec/路由路径中的spec类型。如果我将它移出站点并将其置于spec/request或spec/api下,它一定会工作。我将在rspec rails中为此打开一个问题。这对你有好处理解,但我在尝试此操作时遇到问题。在我的Rspec
before
块中,我加载了
seeds.rb
,因为即使在测试中也需要一些基线数据。但是由于重定向使用了一个很小的Rack应用程序,加载
seeds.rb
失败,出现“找不到表”的情况对于我的任何型号,大概是因为non-Rails Rack applet不使用ActiveRecord。因此,我没有好方法对基于重定向的路由进行回归,这些路由在应用程序中确实有效,但我无法通过测试。:-(
expect(response)。要将\u重定向到(“http://www.google.com")
如果您不喜欢“应该”语法。在rspec中,这将是一个请求规范