ผู้ช่วยทดสอบ rspec & ประดิษฐ์

ตามสิ่งนี้ จากวิกิประดิษฐ์ ฉันควรจะสามารถใช้เมธอดตัวช่วย login_user ในการทดสอบคอนโทรลเลอร์ของฉันได้ ดังนั้นฉันจึงมีสิ่งต่อไปนี้ภายในไดเร็กทอรี spec:

#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
...

และ

#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

อย่างไรก็ตามการโทรหาผู้ช่วยไม่ทำงาน:

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

ใครสามารถชี้ไปที่ที่ฉันผิดไป ชุดทดสอบใช้งานได้จากสิ่งนี้ ฉันได้รับข้อความตัวแปรหรือเมธอดโลคัลที่ไม่ได้กำหนด ดังนั้นฉันจึงเดาว่าโมดูลไม่ได้ถูกรวมอยู่ด้วย

Rails 3.0.7 rspec 2.6.0 อุปกรณ์ 1.3.4

ย้อนรอย


person mark    schedule 19.06.2011    source แหล่งที่มา
comment
นั่นเป็นการพิมพ์ผิดใน some_spec.rb ของคุณหรือไม่ log_in / login_user   -  person Dogbert    schedule 19.06.2011
comment
คุณได้ backtrace อะไรมาบ้าง?   -  person Taryn East    schedule 19.06.2011
comment
สวัสดี. ได้เพิ่มคำถามแล้ว   -  person mark    schedule 19.06.2011
comment
เดี๋ยวก่อน - backtrace นั้นบอกว่าไม่พบวิธี login_user ของคุณ ฉันไม่รู้ว่า controller_macros.rb คืออะไร... แต่ลองใส่มันลงใน spec_helper.rb เพื่อดูว่า Login_user ใช้งานได้จริงหรือไม่... จากนั้นลองหาวิธีรวม ControllerMacros เพื่อให้สามารถค้นหาผู้ช่วยของคุณได้ วิธี.   -  person Taryn East    schedule 19.06.2011


คำตอบ (4)


ฉันคิดว่ามีปัญหาสองสามประการกับแนวทางนี้ อย่างแรกคือคุณกำลังใช้ข้อมูลจำเพาะของคำขอ ไม่ใช่ข้อมูลจำเพาะของคอนโทรลเลอร์ ดังนั้นเมธอด login_user จะไม่สามารถใช้งานได้ภายใน config.extend ControllerMacros, :type => :controller ประการที่สอง แม้ว่าคุณจะสามารถรวมวิธีการไว้ได้ แต่ก็มีแนวโน้มว่าจะใช้งานไม่ได้อยู่ดี เนื่องจากตัวช่วยทดสอบ Devise ได้รับการเขียนขึ้นโดยเฉพาะสำหรับการทดสอบคอนโทรลเลอร์/มุมมอง ไม่ใช่การทดสอบการรวม

ดูคำตอบของ David Chelimsky เพื่อ คำถาม SO นี้ ซึ่งอาจช่วยได้

person zetetic    schedule 19.06.2011
comment
ขอบคุณ zetic. คุณพูดถูกแล้ว ฉันทำให้คอนโทรลเลอร์สับสนและขอข้อมูลจำเพาะ คำตอบที่เชื่อมโยงทำงานได้อย่างสมบูรณ์ - person mark; 19.06.2011
comment
วิธีออกจากระบบเซสชันการเข้าสู่ระบบในข้อกำหนด - person aashish; 28.10.2014

ฉันไม่สามารถตอบได้อย่างแน่นอน ... แต่กลิ่นโค้ดสำหรับฉันคือ "before(:each)" ที่กำหนดไว้ในตัวช่วย ทำไมคุณไม่ลอง:

#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

และ

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

และหากล้มเหลว - บางทีอาจไม่พบ @request - ในกรณีนี้ ให้ส่งผ่านเป็นตัวแปรไปที่ login_user

แก้ไข:

ดูเหมือนว่าคุณอาจต้องรวมตัวช่วยทดสอบอุปกรณ์ด้วย rdoc บอกว่าคุณควรมีไฟล์นี้:

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

ไม่แน่ใจว่ามันแตกต่างจากที่คุณได้รับใน spec_helper.rb หรือไม่ ... ดูค่อนข้างคล้ายกับฉัน

person Taryn East    schedule 19.06.2011
comment
ขอบคุณสำหรับคำตอบ. ฉันลองแล้ว แต่มันก็เป็นตัวแปร/ข้อผิดพลาดของวิธีการที่หายไปซึ่งดูเหมือนว่าจะแนะนำว่าโมดูลไม่ได้รวมอยู่ด้วย - person mark; 19.06.2011
comment
อืม - ขออภัย - ฉันใช้กับ Test::Unit (แม้ว่าฉันจะใช้ rspec กับโปรเจ็กต์อื่น) ดังนั้นฉันแค่เดาเท่านั้น ... บางทีคุณอาจต้องการ 'ประดิษฐ์' ใน spec_helper.rb หรือไม่ - person Taryn East; 19.06.2011
comment
สวัสดีทาริน. ขอบคุณสำหรับคำแนะนำ แต่ดูเหมือนว่าฉันสับสนกับข้อมูลจำเพาะของคอนโทรลเลอร์และข้อมูลจำเพาะของคำขอ - person mark; 19.06.2011

ฉันมีปัญหาเดียวกันกับ Rails 3.0.10 rspec 2.6.0 devise 1.3.4 spork-0.9.0.rc9 บนข้อมูลจำเพาะคอนโทรลเลอร์ของฉัน ฉันได้เปลี่ยน config. extend เป็น config.include และใช้งานได้!

person Joel AZEMAR    schedule 08.09.2011

ลืมยืนยันว่าแอปของคุณไม่สามารถยืนยันได้ รหัสของคุณควรมีลักษณะเช่นนี้

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