下划线命名RSpec控制器路由映射失败:GkServiceAreaController测试报错
解决RSpec中ActionController::UrlGenerationError的问题
嘿,这个问题其实很明确——你的路由定义里要求必须传入slug这个动态参数,但测试用例里没传,所以RSpec找不到匹配的路由,才抛出了这个错误。
咱们拆解一下:
- 你配置的路由是
get '/:slug', to: 'gk_service_area#index', as: :service_details,这里的:slug是必填的动态参数,意思是任何访问这个接口的请求都得带上一个slug值(比如/guangzhou或者/shenzhen),路由才能匹配到gk_service_area#index这个动作。 - 但你的测试代码里只是简单写了
get :index,完全没给slug参数,RSpec根本没法生成符合要求的URL,自然就报路由匹配失败了。
给你两种靠谱的解决办法:
方法一:在测试请求里传入slug参数
直接在get请求里通过params传入一个合法的slug值就行,比如:
it 'should render' do get :index, params: { slug: 'test-service-area' } # 随便填一个符合业务规则的slug就行 expect(assigns(:test)).to eq('asfasfd') end
或者用你给路由起的别名service_details来生成路径,这样更符合Rails的最佳实践:
it 'should render' do get service_details_path(slug: 'test-service-area') expect(assigns(:test)).to eq('asfasfd') end
方法二(仅适用于slug可选的场景):修改路由设置默认值
如果你的业务逻辑允许slug参数可选(不过从你的路由设计来看,应该是必须的,所以这个方法只做参考),可以给路由加个默认值:
get '/:slug', to: 'gk_service_area#index', as: :service_details, defaults: { slug: 'default-area' }
这样即使不传slug,路由也能匹配到,但这种情况一般很少见,毕竟你设计这个路由就是为了通过slug区分不同的服务区域。
最后提醒一下:测试带动态参数的控制器动作时,一定要确保传入所有路由要求的必填参数,RSpec才能正确生成请求URL,避免这类路由匹配错误。
内容的提问来源于stack exchange,提问作者TrongBang
相关产品推荐
相关产品推荐

