Тестирование контроллеров Rails3 и Rspec2 с пространством имен - PullRequest
1 голос
/ 01 декабря 2011

Я пытаюсь протестировать контроллер с пространством имен, следующий мой контроллер (/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

Я думаю, это из-за пространства имен 'admin', которое я использую, но как я могу это исправить?

Я использую

  • Rails3
  • Rspec2
  • Linux

1 Ответ

1 голос
/ 02 декабря 2011

Когда вы создаете пространство имен для маршрута, вы создаете 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])
...