Подтвердить что ты не робот

Rails: как изменить тесты для вложенного ресурса?

Во время обучения Rails я создал приложение с контроллером Domains, вложенным ниже контроллера Customers. Я использую 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"}

Однако все тесты для контроллера Domains терпят неудачу из-за ошибок маршрутизации.

Например, следующий тест (сгенерированный генератором ресурсов Rails) не работает, как и все остальные тесты в классе DomainsControllerTest.

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"}

Это имеет смысл, поскольку маршруты по умолчанию больше не существуют, и для контроллера Domains требуется установить @customer. Я провел день, пытаясь найти необходимые изменения, но почти каждый сайт говорит о тестах Rspec вместо обычных тестов Rails.

Как мне изменить domains_controller_test.rb, чтобы он понял вложенный ресурс?

4b9b3361

Ответ 1

Передача customer_id с запросами. Что-то вроде этого: -

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

Ответ 2

Согласно вашим маршрутам, домены больше не существуют вне контекста клиента. Запросу требуется customer_id для соответствия названных маршрутов.

В этом тесте можно сделать следующее:

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

Ответ 3

Существует жемчужина nester, которая решает эту точную проблему. Он генерирует методы, которые возвращают вам domains_path и аналогично, если ваши маршруты не были вложенными. Когда ваши взгляды и тесты ссылаются, например, domain_path(domain), маршруты расширяются до customer_domain_path(domain.customer, domain). Существует также помощник ActionController::TestCase, который добавляет :customer_id => @domain.customer для таких методов, как get, post и т.д.

По умолчанию созданные функциональные тесты и представления работают с этим подходом. (Отказ от ответственности: я написал его).