просмотреть тест с использованием ошибки rspec и factory girl: нет совпадений маршрутов

Я новичок в Ruby & Rails; не занимался программированием; но иметь техническое образование.

Я создал очень небольшое количество функций, в основном основанных на Railscasts, и хочу использовать TDD, и я возвращаюсь и пытаюсь создать несколько простых тестов, прежде чем двигаться дальше.

Я застрял на тесте представления и не могу найти ничего похожего, чтобы понять, как это решить. Я просмотрел Railscasts, книгу RSpec и т. д. и провел много поисков.

Желаемая функциональность работает нормально, но тест не проходит.

Любая помощь или направление приветствуется.

Ошибка:

 Failure/Error: render
 ActionView::Template::Error:
   No route matches {:action=>"show", :controller=>"email_verifies", :id=>nil}
 # ./app/views/email_verifies/edit.html.haml:3:in `_app_views_email_verifies_edit_html_haml__3756516833416545914_70345184965780'
 # ./spec/views/email_verifies/edit.html.haml_spec.rb:6:in `block (2 levels) in <top (required)>'

Код:

приложение/представления/email_verify/edit.html.haml

%h1 Verify Email Address

= form_for @user, :url => email_verify_path(params[:id]) do |f|

  .actions
    = f.submit "Verify Email Address"

spec/views/email_verify/edit.html.haml_spec.rb

require 'spec_helper'

describe "email_verifies/edit.html.haml" do
  let(:user) { FactoryGirl.create(:user, :email_verify_token => "anything") }
  it "displays the text on the rendered page" do
    render
    rendered.should have_content("Verify Email Address")
  end
end

спец/фабрики/фабрики.рб

FactoryGirl.define do
  factory :user do
    sequence :email do |n|
      "foo#{n}@example.com" 
    end
    password "secret"
  end
end

часть app/controllers/email_verify_controller.rb (в этом контроллере нет действия «показать»)

def edit
  @user = User.find_by_email_verify_token(params[:id])
  unless @user
    redirect_to signup_path, :alert => "This email verification has expired.  Please sign up again."
  end
end

Некоторые маршруты:

edit_email_verify GET    /email_verifies/:id/edit(.:format)  email_verifies#edit  
     email_verify GET    /email_verifies/:id(.:format)       email_verifies#show  
email_verifies    GET    /email_verifies(.:format)           email_verifies#index  
edit_email_verify GET    /email_verifies/:id/edit(.:format)  email_verifies#edit  
     email_verify GET    /email_verifies/:id(.:format)       email_verifies#show  
                  PUT    /email_verifies/:id(.:format)       email_verifies#update

Версии:

ruby 1.9.3p362
rails (3.2.13)
factory_girl (4.2.0)
factory_girl_rails (4.2.1)
rspec (2.13.0)
rspec-core (2.13.1) )
rspec-expectations (2.13.0)
rspec-mocks (2.13.1)
rspec-rails (2.13.2)


person jbbythebch    schedule 16.09.2013    source источник


Ответы (1)


Я немного не знаком с этим синтаксисом, но, судя по ошибке, я думаю, что проблема здесь:

  it "displays the text on the rendered page" do
    render #HERE!
    rendered.should have_content("Verify Email Address")
  end

в любом случае проблема в том, что действие редактирования (которое, я думаю, вы пытаетесь протестировать здесь) нуждается в :id, чтобы оно знало, какое электронное письмо редактировать - проверьте вывод rake routes

edit_email_verify GET    /email_verifies/:id/edit(.:format) 

вам нужно включить :id в этот вызов рендеринга - это может сработать:

изменять

it "displays the text on the rendered page" do
  render
  rendered.should have_content("Verify Email Address")
end

to

it "displays the text on the rendered page" do
  render edit_email_verify_path(@user) #the @user might need to be changed 
                                       #depending on what the `:id` refers to
  rendered.should have_content("Verify Email Address")
end

Обновить

Я только что попробовал render edit_email_verify_path(:id => user.email_verify_token), и он, кажется, передает правильный :id, а затем получает ошибку

ActionView::MissingTemplate: Missing partial /email_verifies/anything/edit with {:locale=>[:en], :formats=>[:html, :text, :js, :css, :ics, :csv, :png, :jpeg, :gif, :bmp, :tiff, :mpeg, :xml, :rss, :atom, :yaml, :multipart_form, :url_encoded_form, :json, :pdf, :zip], :handlers=>[:erb, :builder, :coffee, :haml]} 

Должен был видеть это раньше, но проблема здесь:

Missing partial /email_verifies/****anything****/edit

:id в /email_verifies/:id/edit — это пользователи :id, так что попробуйте

render edit_email_verify_path(user)

который вернет /email_verifies/[your users id]/edit

person dax    schedule 16.09.2013
comment
Спасибо. Я думаю, вы правы, но я пытался найти подробности о синтаксисе рендеринга и не нашел ничего работающего. Аналогичных примеров я тоже не нашел. Кажется, что это должно быть просто, но у меня проблемы с этим. - person jbbythebch; 16.09.2013
comment
Небольшой прогресс... ошибка изменилась на: No route matches {:action=>"edit", :controller=>"email_verifies", :id=>nil} Насколько я могу судить, :id должен быть email_verify_token, но он не передается при рендеринге. Когда я протестировал аналогичный код, который создал переменную вместо использования «let», он правильно записал email_verify_token в тестовую базу данных. - person jbbythebch; 17.09.2013
comment
Я только что попробовал render edit_email_verify_path(:id => user.email_verify_token), и он, кажется, передает правильный :id, а затем получает ошибку ActionView::MissingTemplate: Missing partial /email_verifies/anything/edit with {:locale=>[:en], :formats=>[:html, :text, :js, :css, :ics, :csv, :png, :jpeg, :gif, :bmp, :tiff, :mpeg, :xml, :rss, :atom, :yaml, :multipart_form, :url_encoded_form, :json, :pdf, :zip], :handlers=>[:erb, :builder, :coffee, :haml]} - person jbbythebch; 17.09.2013
comment
Я думаю, что он находится в нужном месте, это первый из перечисленных выше в разделе «Код:», и я также указал путь над кодом на случай, если это было проблемой, а именно: app/views/email_verifies/edit.html.haml - person jbbythebch; 17.09.2013
comment
Ваше обновление, вероятно, является хорошим предположением, но в этом случае оно фактически использует «email_verify_token» в качестве «:id», переданного действию редактирования в контроллере, для выполнения поиска по этому токену, как показано в этой строке (показано выше в раздел кода): @user = User.find_by_email_verify_token(params[:id]); по крайней мере, это мое понимание этого. И в браузере, работающем на локальном сервере разработки, это токен в URL-адресе. - person jbbythebch; 18.09.2013
comment
он показывает это в браузере, но он работает только потому, что рельсы достаточно умны, чтобы вытащить то, что ему нужно - ваша ошибка была Missing partial /email_verifies/anything/edit - подумайте о том, что это говорит - он не может найти объект для редактирования, и как он его найдет будет через :id - в данном случае идентификатор пользователя. попробуйте и посмотрите, работает ли это (по крайней мере, в наборе тестов) - person dax; 18.09.2013
comment
Извините за задержку ответа @dax. Я попробовал render edit_email_verify_path(:id => user.id) и получил почти ту же ошибку: Missing partial /email_verifies/3/edit with {:locale=>[:en], :formats=>[:html, .... - person jbbythebch; 18.09.2013
comment
проверьте этот вопрос: stackoverflow.com/questions /10943744/ - person dax; 18.09.2013
comment
Я попытался скопировать app/views/email_verifies/edit.html.haml в (тот же путь) _edit.html.haml и даже _edit.html и _edit.haml на всякий случай и получил ту же ошибку, что и выше, Missing partial /email_verifies/anything/edit with {:locale=>[:en], :formats=>[:html, .... Я нашел вопрос (в следующем комментарии не хватило места), в котором «nathanvda» говорит: «Во-вторых, если ваше представление не является частичным, ожидающим переменные, вы должны просто написать» render (полностью пропускает любой следующий код), поэтому Мне интересно, если в нашем коде render edit_email_verify_path... почему он ищет частичное. - person jbbythebch; 19.09.2013
comment
Связанный вопрос: stackoverflow.com/questions/8187944 / Хотя я действительно ценю вашу настойчивость @dax и ненавижу сдаваться, я начинаю думать, что мы могли бы прекратить заниматься этим вопросом, и, возможно, когда у меня будет больше опыта, я смогу переписать тест, или, как говорит последний постер в упомянутом выше вопросе, просто перестаньте писать спецификации представления и используйте Cucumber, поскольку «их бесполезно сложно писать, и они действительно недостаточно тестируют, чтобы быть вообще стоящим». - person jbbythebch; 19.09.2013