การทดสอบตัวควบคุม RSpec - การตอบสนองที่ว่างเปล่าร่างกาย


103

ฉันติดปัญหาเมื่อทดสอบคอนโทรลเลอร์ด้วย RSpec - response.body call ส่งคืนสตริงว่างเสมอ ในเบราว์เซอร์ทุกอย่างแสดงผลอย่างถูกต้องและการทดสอบคุณสมบัติแตงกวาดูเหมือนจะทำให้ถูกต้อง แต่ RSpec ก็ล้มเหลวทุกครั้ง

ความคาดหวังอื่น ๆ เกี่ยวกับวัตถุตอบสนองเช่นการresponse.should render_template('index')ส่งผ่านโดยไม่มีปัญหาใด ๆ

คุณเคยพบปัญหานี้มาก่อนหรือไม่? บางที html ตอบกลับสามารถหาได้ด้วยวิธีอื่น?

สำหรับเวอร์ชัน Rails 2.1.0, RSpec 1.2.7

คำตอบ:


194

ตามค่าเริ่มต้น rspec-rail จะแฮ็กเข้าสู่ Rails เพื่อป้องกันไม่ให้แสดงเทมเพลตมุมมองจริง คุณควรทดสอบพฤติกรรมของการกระทำของคุณและกรองการทดสอบตัวควบคุมของคุณเท่านั้นไม่ใช่ผลของการแสดงผลเทมเพลตนั่นคือข้อกำหนดของมุมมอง

อย่างไรก็ตามหากคุณต้องการสร้างข้อมูลจำเพาะของคอนโทรลเลอร์ของคุณให้แสดงเทมเพลตตามที่แอปทำตามปกติให้ใช้render_viewsคำสั่ง:

describe YourController do
  render_views
  ...
end

2
ขอบคุณสิ่งที่ฉันต้องการ
Toms Mikoss

2
ฉันทำงานกับ Rails มาหลายปีแล้วและในที่สุดฉันก็เข้าใจความแตกต่างระหว่างข้อกำหนดของคอนโทรลเลอร์และคำขอ ขอบคุณ!
Brian Underwood


2

ในขณะที่ฉันทำงานกับปัญหาที่คล้ายกัน (ซึ่งทำให้ฉันเกิดคำถามนี้) มันเกิดขึ้นกับฉันว่ามีหลายวิธีในการถลกหนังแมวตัวเดียวกัน กล่าวอีกนัยหนึ่งคือแทนที่จะตรวจสอบเนื้อหาคุณอาจสามารถตรวจสอบเนื้อหาของแฟลชได้

response.body.should =~ /Invalid email or password/

อาจเป็นการตรวจสอบที่เทียบเท่ากับ:

flash[:alert].should == "Invalid email or password"

สำหรับฉันอย่างหลังดูเหมือนจะยืดหยุ่นกว่าเล็กน้อยเนื่องจากจะวิ่งไปทางใดทางหนึ่ง แต่อาจไม่เหมาะสมในทุกกรณี

ไชโย

จอห์น


2

โดยค่าเริ่มต้นการกำหนดค่าราง RSpec จะปิดใช้งานการแสดงเทมเพลตสำหรับข้อมูลจำเพาะของคอนโทรลเลอร์

วิธีหนึ่งในการแก้ไขปัญหานี้คือการเปิดใช้งานการrender_viewsตั้งค่าในrails_helper.rbไฟล์ของคุณ ด้วยวิธีนี้คุณจะทำให้สามารถทำงานได้ทั่วโลกในการทดสอบทั้งหมดของคุณ

RSpec.configure do |config|
  config.render_views
end

หรือใช้ render_views ประกาศแต่ละกลุ่ม:

describe User do
  render_views
end

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.