Тестирование действия вложенного контроллера с RSpec - PullRequest
2 голосов
/ 08 ноября 2011

У меня настроены маршруты, которые выглядят следующим образом:

match '/things/:thing_id' => "descriptions#index", :as => :thing
resources :things, :except => [:show] do 
  ...
  resources :descriptions, :only => [:create, :index]
end

Как мне проверить метод :create для вложенных описаний?

Пока у меня есть

context "with user signed in" do

  before(:each) do
    user = Factory.create(:user, :name => "Bob")
    controller.stub!(:authenticate_user!).and_return(true)
    controller.stub!(:current_user).and_return(user)
  end

  describe "PUT create" do

    before(:each) do
      @thing = Factory.create(:thing)
      params = {"text" => "Happy Text"}

      post thing_descriptions_path(@thing.id), params  #Doesn't work
      post :create, params                             #Doesn't work

    end
  end
end

1 Ответ

3 голосов
/ 30 ноября 2011

Должно работать следующее:

describe "PUT create" do

  before(:each) do
    @thing = Factory(:thing)
    attrs = FactoryGirl.attributes_for(:description, :thing_id => @thing)

    post :create, :thing_id => @thing, :description => attrs
  end
end

Чтобы создать вложенный ресурс, необходимо указать rspec идентификатор родительского объекта в записи create, чтобы он мог вставить его в маршрут.

Вам также необходимо создать фабрику :descriptions с отношением к встроенному :thing, а также передать thing_id в создание атрибута :description, чтобы убедиться, что Factory Girl нене создавайте новый :thing, когда он создает атрибуты для :description, в то время как это не приведет к сбою теста, это замедлит его, поскольку вы в итоге создадите два экземпляра :thing.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...