2011-12-01 103 views
1

我想測試一個名字空間的控制,以下Rails3中和Rspec2控制器測試是我的控制器(/admin/sites_controller.rb):與命名空間

class Admin::SitesController < AdminController 
    def create 
    @site = Site.new(params[:site]) 

    respond_to do |format| 
     if @site.save 
     format.html { redirect_to(@site, :notice => 'Site was successfully created.') } 
     format.xml { render :xml => @site, :status => :created, :location => @site } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @site.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 
end 

和下面是我的routes.rb文件

namespace :admin do 
    resources :sites 
end 

我使用rspec2來測試我的控制器和以下是我的控制器規格

describe Admin::SitesController do 
    describe "POST create" do 
    describe "with valid params" do 
     it "creates a new Site" do 
     expect { 
      post :create, :site => valid_attributes 
     }.to change(Site, :count).by(1) 
     end 
    end 
    end 
end 

但是當我運行規範它給了我下面的路由錯誤

Admin::SitesController POST create with valid params creates a new Site 
    Failure/Error: post :create, :site => valid_attributes 
    NoMethodError: 
     undefined method `site_url' for #<Admin::SitesController:0xb5fbe6d0> 
    # ./app/controllers/admin/sites_controller.rb:47:in `create' 
    # ./app/controllers/admin/sites_controller.rb:45:in `create' 
    # ./spec/controllers/admin/sites_controller_spec.rb:78 
    # ./spec/controllers/admin/sites_controller_spec.rb:77 

我猜它是因爲我使用的是「管理」命名空間,但我怎麼能解決呢?

我使用的這個樣子

  • Rails3中
  • Rspec2
  • Linux的
+0

喜iWasRobbed,對不起,我將鐵鍋上,多虧 – sameera207

回答

1

當你命名空間的路線,你正在創建URL和路徑助手:

HTTP Verb Path      action helper 
GET  /admin/sites    index admin_sites_path 
GET  /admin/sites/new   new  new_admin_site_path 
POST  /admin/sites    create admin_sites_path 
GET  /admin/sites/:id   show  admin_site_path(:id) 
GET  /admin/sites/:id/edit edit  edit_admin_site_path(:id) 
PUT  /admin/sites/:id   update admin_site_path(:id) 
DELETE  /admin/sites/:id   destroy admin_site_path(:id) 

所以你可以它們直接用在你的代碼中(即redirect_to admin_site_path(@site)),或者你可以這樣做:

redirect_to([:admin, @site]) 
+0

嗨@iWasRobbed,謝謝,你是正確的,它是在控制器側的問題(重定向問題) – sameera207

+0

很高興幫助Sameera – iwasrobbed