Rails:如何修改嵌套资源的testing?

在学习Rails的时候,我创build了一个嵌套在Customers控制器下面的Domains控制器的应用程序。 我正在使用Rails 2.3.4,这是一个学习的经验。 我设法得到下面的路由设置:

  customer_domains GET /customers/:customer_id/domains(.:format) {:controller=>"domains", :action=>"index"} POST /customers/:customer_id/domains(.:format) {:controller=>"domains", :action=>"create"} new_customer_domain GET /customers/:customer_id/domains/new(.:format) {:controller=>"domains", :action=>"new"} edit_customer_domain GET /customers/:customer_id/domains/:id/edit(.:format) {:controller=>"domains", :action=>"edit"} customer_domain GET /customers/:customer_id/domains/:id(.:format) {:controller=>"domains", :action=>"show"} PUT /customers/:customer_id/domains/:id(.:format) {:controller=>"domains", :action=>"update"} DELETE /customers/:customer_id/domains/:id(.:format) {:controller=>"domains", :action=>"destroy"} customers GET /customers(.:format) {:controller=>"customers", :action=>"index"} POST /customers(.:format) {:controller=>"customers", :action=>"create"} new_customer GET /customers/new(.:format) {:controller=>"customers", :action=>"new"} edit_customer GET /customers/:id/edit(.:format) {:controller=>"customers", :action=>"edit"} customer GET /customers/:id(.:format) {:controller=>"customers", :action=>"show"} PUT /customers/:id(.:format) {:controller=>"customers", :action=>"update"} DELETE /customers/:id(.:format) {:controller=>"customers", :action=>"destroy"} root / {:controller=>"customers", :action=>"index"} 

但是,由于路由错误,域控制器的所有testing都失败。

例如,以下testing(由Rails的资源生成器生成)失败,就像DomainsControllerTest类中的所有其他testingDomainsControllerTest

 class DomainsControllerTest < ActionController::TestCase test "should get index" do get :index assert_response :success assert_not_nil assigns(:domains) end end 

它失败,错误:

 No route matches {:action => "index", :controller => "domains"} 

这是有道理的,因为默认路由不再存在,域控制器需要设置@customer 。 我花了一个下午的时间寻找所需的改变,但几乎每个网站都会谈论Rspectesting,而不是常规的Railstesting。

如何修改domains_controller_test.rb以便理解嵌套的资源?

传递customer_id与请求会做。 像这样的东西: –

 class DomainsControllerTest <ActionController :: TestCase
  testing“应该得到索引”做
     get:index,:customer_id => 1
     assert_response:成功
     assert_not_nil赋值(:域)
  结束
结束

有一个称为nester的gem可以解决这个确切的问题。 它生成的方法可以让你返回一个domains_path ,类似于你的路由没有嵌套。 当您的视图和testing引用(例如, domain_path(domain) ,路由将扩展到customer_domain_path(domain.customer, domain) 。 还有一个ActionController::TestCase助手,它为getpost等方法增加了:customer_id => @domain.customer

这种方法默认生成functiontesting和视图。 (免责声明:我写的)。

根据您的路线,域名不再存在于客户的上下文之外。 该请求需要一个customer_id来匹配指定的路由。

在testing中做到这一点的方法是:

 test "should get index" do get :index, :customer_id=>joe end