无法通过CREATING INDEX ROUTE TEST查看嵌套属性的问题。我一直在尝试所有的想法,但没有任何作用
我有服务模型和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
答案 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