Ошибка: «Не найдено ни одного маршрута {: id => nil,: controller =>« community »,: action =>« edit »}» является результатом строки в вашем блоке before (: each), которая читает:
@community = controller.current_user.communities.new[Factory.build(:community, :company => @company)]
Обратите внимание, что Factory.build отличается от Factory.create.Build создает новый экземпляр объекта, но фактически не сохраняет его в базе данных.Кроме того, вы создаете новый экземпляр сообщества с этим новым экземпляром Factory, не сохраняя его.Я бы предложил создать ваше сообщество следующим образом:
@community = Factory.create(:community, :company => @company)
Позже вы берете эту переменную @community и передаете ее в своем тесте методу get:
get :edit, :id => @community
Потому чтосообщество не сохранено, у него нет идентификатора.Он существует только в памяти.Кроме того, правильнее было бы отправить get id объекта @community (после того, как вы обновили Factory.build для чтения Factory.create):
get :edit, :id => @community.id
Во-вторых, ваша ассоциация не выглядитв соответствии с логикой в вашем контроллере на линии:
controller.current_user.company.communities.should_receive(:find).with(:company => @company)
В вашем контроллере вы находите сообщество с помощью цепочки через current_user.communities, а не current_user.company.communities.Я бы порекомендовал удалить этот тест, так как вы хотите проверить результат, а не реализацию.Это делает тесты слишком хрупкими для изменений кода.
И последнее, я хотел бы отметить, что у вас есть несколько утверждений в ваших тестах.Вы утверждаете в своем before (: each):
controller.current_user.company.communities.should_receive(:find).with(:company => @company)
Это выполняется в каждом из вложенных тестов ниже, так что каждый тест проверяет два условия.Это должно быть лучше изолированно.Я бы предложил перенести этот код в собственный тестовый блок и вывести его из метода before:
it "should find communities" do
controller.current_user.company.communities.should_receive(:find).with(:company => @company)
end
Однако, как я упоминал выше, я не думаю, что этот тест является хорошей идеей, так какслишком тесно связан с реализацией того, что вы тестируете.