嵌套资源的控制器测试

时间:2017-04-27 14:29:15

标签: ruby-on-rails ruby for-loop testing ruby-on-rails-5

无法通过CREATING INDEX ROUTE T​​EST查看嵌套属性的问题。我一直在尝试所有的想法,但没有任何作用

我有服务模型和ServiceRoute模型。

ServiceRoute belongs_to Service

服务has_many ServiceRoutes。

这是我的控制器:

class ServiceRoutesController < ApplicationController

before_action :set_service_route, only: [:show, :update, :destroy]
before_action :set_service, only: :create


def create
  @service_route = @service.service_routes.build(service_route_params)

  if @service_route.save
    render json: @service_route, status: :created, location: @service_route
  else
    render json: @service_route.errors, status: :unprocessable_entity
  end
end


private

  def set_service_route
    @service_route = ServiceRoute.find(params[:id])
  end

  def set_service
   @service = Service.find(params[:service_id])
  end

  def service_route_params
    params.require(:service_route).permit(:routes_list, :service_id)
  end
end

我使用构建方法

创建ServiceRoute

我的routes.rb文件:

resources :services do
  resources :service_routes
end

测试&#34;应该创建服务路线&#34;有一个错误:

ActionController :: UrlGenerationError:没有路由匹配{:action =&gt;&#34; index&#34;,:controller =&gt;&#34; service_routes&#34;}缺少必需的密钥:[:service_id ]

test "should create service_route" do
 assert_difference('ServiceRoute.count') do
  post service_service_routes_url, params: { service_route: {routes_list: 
  @service_route.routes_list, service_id: @service_route.service_id } }, 
 as: :json
end

我应该如何重构此测试以匹配路线: / services /:service_id / service_routes

1 个答案:

答案 0 :(得分:1)

测试嵌套路由可能会给测试放置的位置带来一些困惑。虽然嵌套可能会让你觉得孩子们的测试应该写在父母的测试中,但事实上他们应该在他们自己的测试用例中被隔离。

Rspec使用Test Case类名推断出正在测试的控制器。您也可以使用类方法.tests来表明它。

  

ActionController :: TestCase将自动推断控制器   从测试类名称测试。如果控制器不能   从测试类名称推断,您可以使用显式设置它   + +测试

虽然您可能想要将路径用作方法.post的第一个参数,但TestCase需要一个操作名称,例如:index:create,{{ 1}}等等。测试的正确语法应该是:

:update

以下是post :create, params: { service_id: @service_route.service_id, service_route: { routes_list: @service_route.routes_list } } 的文档资料。

TestCase.get