应该有子域的路由匹配器
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"
。
- 我试过把它放在 BillControllerTest 中(没有改变);
- 我已经尝试过集成测试(路由匹配器不起作用);
- 我试过使用
setup { host! 'api.example.com' }
和 setup { @request.host = 'api.example.com' }
设置主机
- 我尝试将完整的 URL 放入获取请求 (
{ get 'http://api.example.com/v1/bills' }
);
- 我试过将
subdomain: 'api'
和 constraints: subdomain: 'api'
放在任何可能有意义的地方。
使用 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)
...
我正在使用 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"
。
- 我试过把它放在 BillControllerTest 中(没有改变);
- 我已经尝试过集成测试(路由匹配器不起作用);
- 我试过使用
setup { host! 'api.example.com' }
和setup { @request.host = 'api.example.com' }
设置主机
- 我尝试将完整的 URL 放入获取请求 (
{ get 'http://api.example.com/v1/bills' }
); - 我试过将
subdomain: 'api'
和constraints: subdomain: 'api'
放在任何可能有意义的地方。
使用 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)
...