Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 针对嵌套多态资源的rails控制器测试_Ruby On Rails 4_Minitest_Pundit - Fatal编程技术网

Ruby on rails 4 针对嵌套多态资源的rails控制器测试

Ruby on rails 4 针对嵌套多态资源的rails控制器测试,ruby-on-rails-4,minitest,pundit,Ruby On Rails 4,Minitest,Pundit,我已经试过很多次做rails测试了,你可能认为我现在已经明白了——我还没有 最新的方法是使用minitest——至少它主要是Ruby,而不是一堆DSL,它们正在用数百种方法学习另一种语言。现在,我可能已经用我最新的实验把自己挖进了一个洞,但我有点喜欢我试图完成的。它是嵌套资源的组合,包括一些多态资源。它还使用权威进行授权 这些模型定义了一个层次实体(想想公司或政府机构,比如林业局,或者在我的例子中是VFW层次) 基本模型 只要看看邮局官员,生成的路线是: post_officers_path

我已经试过很多次做rails测试了,你可能认为我现在已经明白了——我还没有

最新的方法是使用minitest——至少它主要是Ruby,而不是一堆DSL,它们正在用数百种方法学习另一种语言。现在,我可能已经用我最新的实验把自己挖进了一个洞,但我有点喜欢我试图完成的。它是嵌套资源的组合,包括一些多态资源。它还使用权威进行授权

这些模型定义了一个层次实体(想想公司或政府机构,比如林业局,或者在我的例子中是VFW层次)

基本模型 只要看看邮局官员,生成的路线是:

post_officers_path  POST  /posts/:post_id/officers(.:format)  officers#create
new_post_officer_path GET /posts/:post_id/officers/new(.:format)  officers#new
我的问题是让控制器测试正常工作,而不用花我的余生去解决它!我确实使用了脚手架来生成模型和测试。我开始倾向于说控制器测试是一种重复的浪费时间的行为,并将注意力集中在集成测试上。我的主要问题是:新的和:为多态性关联(如官员)创建测试。我以前的钝力测试很好(知道这不是最好的方法)并安排所有工作。控制器新建和创建测试将失败,原因是
ActionController::UrlGenerationError:没有路由匹配{:action=>“/posts/980190962/officers/new”,:controller=>“officers”}
没有路由匹配{:action=>“new”,:controller=>“officers”}

甚至为一个新的邮政官员硬接线:

def test_new_post
  get "/posts/#{@resource.id}/officers/new"
  assert_response :success
end
失败了


我主要是看控制器测试来做基本的CRUD和授权,但是我认为在集成测试中测试授权更容易,特别是如果有不同的角色来做不同的事情-但是我应该能够弄清楚这一点。我已经看过关于stackoverflow的数百篇文章,但似乎没有一篇涉及多态嵌套资源。

这是一个借口,但我建议不要测试控制器,不要将复杂的逻辑提取到易于测试的服务中。具体来说,我建议使用将逻辑提取到返回上下文的简单服务调用中。继续通过集成测试测试快乐路径,并通过其服务对复杂控制器行为进行单元测试。如果这对你不起作用,祝你好运!这是一种逃避,但我建议不要测试控制器,不要将复杂的逻辑提取到易于测试的服务中。具体来说,我建议使用将逻辑提取到返回上下文的简单服务调用中。继续通过集成测试测试快乐路径,并通过其服务对复杂控制器行为进行单元测试。如果这对你不起作用,祝你好运!
post_officers_path  POST  /posts/:post_id/officers(.:format)  officers#create
new_post_officer_path GET /posts/:post_id/officers/new(.:format)  officers#new
def test_new_post
  get "/posts/#{@resource.id}/officers/new"
  assert_response :success
end