Ответ 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
Во время обучения 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
, чтобы он понял вложенный ресурс?
Передача 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
Согласно вашим маршрутам, домены больше не существуют вне контекста клиента. Запросу требуется customer_id
для соответствия названных маршрутов.
В этом тесте можно сделать следующее:
test "should get index" do
get :index, :customer_id=>joe
end
Существует жемчужина nester, которая решает эту точную проблему. Он генерирует методы, которые возвращают вам domains_path
и аналогично, если ваши маршруты не были вложенными. Когда ваши взгляды и тесты ссылаются, например, domain_path(domain)
, маршруты расширяются до customer_domain_path(domain.customer, domain)
. Существует также помощник ActionController::TestCase
, который добавляет :customer_id => @domain.customer
для таких методов, как get
, post
и т.д.
По умолчанию созданные функциональные тесты и представления работают с этим подходом. (Отказ от ответственности: я написал его).