lihat tes menggunakan rspec & kesalahan gadis pabrik: Tidak ada rute yang cocok

Saya cukup baru mengenal Ruby & Rails; belum melakukan banyak pemrograman; tetapi memiliki latar belakang teknologi.

Saya telah membangun sejumlah kecil fungsionalitas yang sebagian besar didasarkan pada Railscasts dan ingin menggunakan TDD, dan saya akan kembali dan mencoba membuat beberapa tes sederhana sebelum melanjutkan.

Saya terjebak dalam pengujian tampilan dan tidak dapat menemukan sesuatu yang cukup serupa untuk mencari cara mengatasi masalah ini. Saya telah memeriksa Railscasts, buku The RSpec, dll., dan telah melakukan banyak pencarian.

Fungsionalitas yang diinginkan tampaknya berfungsi dengan baik, tetapi pengujian gagal.

Bantuan atau arahan apa pun dihargai.

Kesalahan:

 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)>'

Kode:

app/views/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

spesifikasi/pabrik/pabrik.rb

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

bagian dari app/controllers/email_verify_controller.rb (tidak ada tindakan 'tampilkan' di pengontrol ini)

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

Beberapa rute:

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

Versi:

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 sumber


Jawaban (1)


Saya agak asing dengan sintaks ini, tetapi berdasarkan kesalahannya, menurut saya masalahnya ada di sini:

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

bagaimanapun masalahnya adalah tindakan edit (yang menurut saya adalah apa yang Anda coba uji di sini) memerlukan :id sehingga ia mengetahui email apa yang harus diedit - lihat output dari rake routes

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

Anda perlu memasukkan :id dalam panggilan render itu - ini mungkin berhasil:

mengubah

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

memperbarui

Saya baru saja mencoba render edit_email_verify_path(:id => user.email_verify_token), dan sepertinya melewati :id yang benar, dan kemudian mendapat kesalahan

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

Seharusnya sudah pernah melihat ini sebelumnya, tapi masalahnya ada di sini:

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

:id di /email_verifies/:id/edit adalah pengguna :id jadi Anda harus mencobanya

render edit_email_verify_path(user)

yang akan mengembalikan /email_verifies/[your users id]/edit

person dax    schedule 16.09.2013
comment
Terima kasih. Saya pikir Anda benar, tetapi saya sudah mencoba mencari detail tentang sintaks render dan belum menemukan sesuatu yang berhasil. Saya juga tidak dapat menemukan contoh serupa. Sepertinya itu seharusnya sederhana, tapi saya mengalami masalah dengan itu. - person jbbythebch; 16.09.2013
comment
Sedikit kemajuan...kesalahan berubah menjadi: No route matches {:action=>"edit", :controller=>"email_verifies", :id=>nil} Sejauh yang saya tahu, :id seharusnya berupa email_verify_token, tetapi tidak diteruskan menggunakan render. Ketika saya menguji beberapa kode serupa yang membuat variabel alih-alih menggunakan 'biarkan', kode tersebut menulis email_verify_token dengan benar ke db pengujian. - person jbbythebch; 17.09.2013
comment
Saya baru saja mencoba render edit_email_verify_path(:id => user.email_verify_token), dan sepertinya melewati :id yang benar, lalu mendapat kesalahan 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
Saya pikir itu di tempat yang tepat, itu yang pertama tercantum di atas di bawah 'Kode:', dan saya juga meletakkan jalur di atas kode jika itu merupakan masalah, yaitu: app/views/email_verifies/edit.html.haml - person jbbythebch; 17.09.2013
comment
Pembaruan Anda mungkin merupakan asumsi yang bagus, tetapi dalam kasus ini, sebenarnya menggunakan 'email_verify_token' sebagai ':id' yang diteruskan ke tindakan edit di pengontrol untuk melakukan pencarian berdasarkan token tersebut seperti yang terlihat pada baris ini (ditunjukkan di atas pada bagian kode): @user = User.find_by_email_verify_token(params[:id]); setidaknya itulah pemahaman saya tentang ini. Dan di browser yang berjalan di server dev lokal, itu adalah token di url. - person jbbythebch; 18.09.2013
comment
itu menunjukkan hal itu di browser, tetapi itu hanya berfungsi karena Rails cukup pintar untuk menarik apa yang dibutuhkan - kesalahan Anda adalah Missing partial /email_verifies/anything/edit - pikirkan apa yang dikatakannya - ia tidak dapat menemukan objek untuk diedit, dan cara menemukannya akan melalui :id - dalam hal ini id pengguna. cobalah dan lihat apakah berhasil (setidaknya di rangkaian pengujian) - person dax; 18.09.2013
comment
Maaf atas keterlambatan respons @dax. Saya mencoba render edit_email_verify_path(:id => user.id) dan mendapatkan kesalahan yang hampir sama: Missing partial /email_verifies/3/edit with {:locale=>[:en], :formats=>[:html, .... - person jbbythebch; 18.09.2013
comment
lihat pertanyaan ini: stackoverflow.com/questions /10943744/ - person dax; 18.09.2013
comment
Saya mencoba menyalin app/views/email_verifies/edit.html.haml ke (jalur yang sama) _edit.html.haml, dan bahkan _edit.html, & _edit.haml untuk berjaga-jaga, dan mendapatkan kesalahan yang sama seperti di atas, Missing partial /email_verifies/anything/edit with {:locale=>[:en], :formats=>[:html, .... Saya menemukan pertanyaan (di komentar berikutnya, kehabisan ruang), di mana 'nathanvda' mengatakan 'Kedua, kecuali tampilan Anda sebagian yang mengharapkan variabel, Anda sebaiknya menulis' render (hilangkan kode berikut sepenuhnya), jadi Saya bertanya-tanya apakah dalam kode kita, render edit_email_verify_path... mengapa ia mencari sebagian. - person jbbythebch; 19.09.2013
comment
Pertanyaan terkait: stackoverflow.com/questions/8187944 / Meskipun saya sangat menghargai kegigihan Anda @dax, dan tidak suka menyerah, saya mulai berpikir kita mungkin ingin berhenti menanyakan pertanyaan ini, dan mungkin setelah saya memiliki lebih banyak pengalaman, saya akan dapat menulis ulang tes, atau seperti yang dikatakan poster terakhir dalam pertanyaan yang direferensikan di atas, berhentilah menulis spesifikasi tampilan sama sekali dan gunakan Mentimun, karena 'Mereka tidak perlu sulit untuk ditulis, dan mereka benar-benar tidak cukup menguji untuk menjadi bermanfaat'. - person jbbythebch; 19.09.2013