rspec & merancang pembantu tes

Menurut ini dari wiki yang dirancang, saya seharusnya bisa menggunakan metode pembantu login_user dalam pengujian pengontrol saya. Oleh karena itu saya memiliki yang berikut ini di dalam direktori spesifikasi:

#spec_helper.rb
...
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

RSpec.configure do |config|
  config.include Devise::TestHelpers, :type => :controller
  config.extend ControllerMacros, :type => :controller
...

Dan

#support/controller_macros.rb
module ControllerMacros    
  def login_user
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      @user = Factory.create(:user)
      sign_in @user
    end
  end
end

namun memanggil pembantu tidak berhasil:

#requests/some_spec.rb
require 'spec_helper'
describe "GET /guides/edit" do
  login_user     
end

Dapatkah seseorang menunjukkan kesalahan saya. Rangkaian pengujian berfungsi dari sini. Saya mendapatkan pesan variabel atau metode lokal yang tidak terdefinisi jadi saya kira modul tidak disertakan.

Rails 3.0.7 rspec 2.6.0 merancang 1.3.4

pelacakan balik


person mark    schedule 19.06.2011    source sumber
comment
Apakah itu salah ketik di some_spec.rb Anda? log_in / login_user   -  person Dogbert    schedule 19.06.2011
comment
Apa penelusuran balik yang Anda dapatkan?   -  person Taryn East    schedule 19.06.2011
comment
Hai. Telah menambah pertanyaan.   -  person mark    schedule 19.06.2011
comment
tunggu - penelusuran balik itu mengatakan tidak dapat menemukan metode login_user Anda. Saya tidak tahu apa itu controller_macros.rb... tapi bagaimana kalau mencoba memasukkannya langsung ke spec_helper.rb untuk melihat apakah login_user benar-benar berfungsi... lalu mencari tahu cara memasukkan ControllerMacros sehingga dapat menemukan pembantu Anda metode.   -  person Taryn East    schedule 19.06.2011


Jawaban (4)


Saya membayangkan ada beberapa masalah dengan pendekatan ini. Pertama adalah Anda menggunakan spesifikasi permintaan, bukan spesifikasi pengontrol, sehingga metode login_user tidak tersedia oleh config.extend ControllerMacros, :type => :controller. Kedua, meskipun Anda dapat menyertakan metode tersebut, kemungkinan besar metode tersebut tidak akan berfungsi, karena pembantu pengujian Rancangan secara khusus ditulis untuk pengujian pengontrol/tampilan, bukan pengujian integrasi.

Lihat jawaban David Chelimsky ke pertanyaan SO ini, yang mungkin bisa membantu.

person zetetic    schedule 19.06.2011
comment
Terima kasih zetetik. Anda sepenuhnya benar, saya membingungkan pengontrol dan spesifikasi permintaan. Jawaban tertaut berfungsi dengan baik. - person mark; 19.06.2011
comment
Cara keluar_dari sesi masuk dalam spesifikasi. - person aashish; 28.10.2014

Saya tidak bisa menjawab dengan pasti... tetapi bau kode bagi saya adalah "sebelum(:masing-masing)" yang didefinisikan di dalam helper. kenapa kamu tidak mencoba:

#support/controller_macros.rb
module ControllerMacros    
  def login_user
    @request.env["devise.mapping"] = Devise.mappings[:user]
    @user = Factory.create(:user)
    sign_in @user
  end
end

Dan

#requests/some_spec.rb
require 'spec_helper'
describe "GET /guides/edit" do
  before(:each) do
    login_user     
  end
end

dan jika gagal - mungkin @request tidak dapat ditemukan - dalam hal ini, teruskan sebagai variabel ke login_user

Sunting:

Sepertinya Anda mungkin perlu menyertakan alat bantu tes rancangan. rdoc mengatakan Anda harus memiliki file ini:

# spec/support/devise.rb
RSpec.configure do |config|
  config.include Devise::TestHelpers, :type => :controller
end

Tidak yakin apakah itu berbeda dari yang sudah Anda dapatkan di spec_helper.rb ... terlihat sangat mirip dengan saya.

person Taryn East    schedule 19.06.2011
comment
Terima kasih atas jawaban anda. Saya mencobanya tetapi selalu ada variabel/kesalahan metode yang hilang yang sepertinya menunjukkan bahwa modul tidak disertakan sama sekali. - person mark; 19.06.2011
comment
Hmm - maaf - Saya menggunakannya dengan Test::Unit (walaupun saya menggunakan rspec pada proyek lain), jadi saya hanya menebak... Mungkin Anda memerlukan 'devise' di spec_helper.rb ? - person Taryn East; 19.06.2011
comment
Hai Taryn. Terima kasih atas saran Anda, tetapi sepertinya saya membingungkan spesifikasi pengontrol dan spesifikasi permintaan. - person mark; 19.06.2011

Saya memiliki masalah yang sama dengan Rails 3.0.10 rspec 2.6.0 merancang 1.3.4 spork-0.9.0.rc9 pada spesifikasi pengontrol saya, saya telah mengubah config. extend menjadi config.include dan berfungsi!

person Joel AZEMAR    schedule 08.09.2011

Lupa mengonfirmasi jika aplikasi Anda tidak dapat dikonfirmasi. Kode Anda akan terlihat seperti ini

module ControllerMacros
  def login_user
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      user = FactoryGirl.create(:user)
      #user.confirm! # or set a confirmed_at inside the factory. Only necessary if you are using the confirmable module
      sign_in user
    end
  end
end
person ndrx42    schedule 25.05.2012