应该有子域的路由匹配器

Shoulda route matcher with subdomains

我正在使用 shoulda 匹配器在新应用程序上测试 Rails 4.2.1 和 Ruby 2.2.0 上的关键路由。我刚刚将我的 API 命名空间移动到一个子域,但我不知道如何让 shoulda 路由匹配器(或任何其他简洁的路由测试)工作。

下面是一些示例代码:

config/routes.rb(使用版本控制进行版本控制,但这不应该是相关的)

  namespace :api, path: '', constraints: { subdomain: 'api'} do
    api_version(module: 'V1',
                path: {value: 'v1'},
                defaults: {format: 'json'}, default: true) do
      resources :bills,         only: :index
    end
  end

app/controllers/api/v1/bills_controller.rb

module API
  module V1
    class Bill < APIVersionsController
      # GET api.example.com/v1/bills.json
      def index
        @bills = Bill.all.limit(10)
        render json: @bills
      end
    end
  end
end

test/controllers/api/v1/routing_test.rb

module API
  module V1
    class RoutingTest < ActionController::TestCase
      setup { @request.host = 'http://api.example.com' }
      should route('/v1/bills')
             .to(controller: :bill, action: :index, format: :json)
    end
  end
end 

在我使用子域之前,should route('/api/v1/bills').to(action: :index, format: :json) 在我的 BillsControllerTest 中工作得很好。

现在,当我 运行 rake test 时,我得到 Minitest::Assertion: No route matches "/v1/bills"

使用 subdomains/what 进行路由测试的简洁方法是当前的最佳实践?有没有办法让 shoulda 路由匹配器与它们一起工作?

这最终成为一个简单的修复。我只需要在 #to 方法中添加一个子域约束并确保 #route 方法具有完整的 url:

module API
  module V1
    class RoutingTest < ActionController::TestCase
      should route(:get, 'http://api.example.com/v1')
               .to('api/v1/data#index', 
                   subdomain: 'api', 
                   format: :json)
      ...

或者,如果您在 data_controller_test.rb,

module API
  module V1
    class DataControllerTest < ActionController::TestCase
      should route(:get, 'http://api.example.com/v1')
               .to(action: :index, 
                   subdomain: 'api', 
                   format: :json)
      ...