การทดสอบคอนโทรลเลอร์ Rspec - วิธีส่งผ่านข้อโต้แย้งไปยังวิธีที่ฉันกำลังทดสอบ

ฉันต้องการทดสอบวิธีนี้ในคอนโทรลเลอร์ของฉัน

def fetch_match_displayed_count(params)
  match_count = 0
  params.each do |param|
    match_count += 1 if param[1]["result"] && param[1]["result"] != "result"
  end
  match_count
end

นี่คือแบบทดสอบที่ฉันเขียนจนถึงตอนนี้

describe "fetch_match_displayed_count" do
  it "should assign match_count with correct number of matches" do
    params = {"result_1"=>{"match_id"=>"975", "result"=>"not_match"}, "result_2"=>{"match_id"=>"976", "result"=>"match"}, "result_3"=>{"match_id"=>"977", "result"=>"not_sure"}, "result_4"=>{"match_id"=>"978", "result"=>"match"}, "result_5"=>{"match_id"=>"979", "result"=>"not_match"}, "workerId"=>"123", "hitId"=>"", "assignmentId"=>"", "controller"=>"mt_results", "action"=>"create"}
    controller.should_receive(:fetch_match_displayed_count).with(params)
    get :fetch_match_displayed_count, {params:params}
    assigns(:match_count).should == 5
  end
end

ปัญหาของฉันดูเหมือนจะอยู่ในบรรทัดนี้ get :fetch_match_displayed_count, {params:params} วิธีการนี้คาดว่าจะมีพารามิเตอร์ แต่จะไม่ได้รับศูนย์

ฉันมีสองคำถาม

  1. วิธีการนี้ควรอยู่ในตัวช่วยและไม่ได้อยู่ในตัวควบคุม (ตามแบบแผน Rails) หรือไม่

  2. ฉันจะส่งคำขอรับและผ่าน params ในการทดสอบได้อย่างไร


person Huy    schedule 01.02.2013    source แหล่งที่มา
comment
นี่เป็นการกระทำหรือไม่? ฉันเดาว่าไม่   -  person zetetic    schedule 01.02.2013
comment
@zetetic ไม่ มันเป็นวิธีการที่ฉันเรียกใช้ในการสร้างการกระทำของฉัน   -  person Huy    schedule 01.02.2013
comment
ฉันสามารถคิดออกได้ ฉันต้องทำให้วิธีการนี้เป็นวิธีการส่วนตัว จากนั้นจึงส่งคำขอรับในการดำเนินการ create จากนั้น ฉันสามารถคาดหวังสิ่งต่อไปนี้: controller.should_receive(:fetch_match_displayed_count).with(params).and_return(5)   -  person Huy    schedule 01.02.2013
comment
เฮ่..ทุบตีฉันทีละวินาที :)   -  person zetetic    schedule 01.02.2013


คำตอบ (1)


ตามกฎทั่วไป คุณควรทดสอบอินเทอร์เฟซสาธารณะของชั้นเรียนของคุณ สำหรับคอนโทรลเลอร์ นี่หมายความว่าคุณทดสอบการกระทำ ไม่ใช่วิธีการช่วยเหลือ

คุณควรจะสามารถทำงานนี้ได้โดยการตั้งค่ากรณีทดสอบแยกกันตั้งแต่หนึ่งกรณีขึ้นไปที่เรียกใช้การดำเนินการที่เหมาะสม จากนั้นใช้ความคาดหวังของข้อความเพื่อทดสอบว่าวิธีตัวช่วยถูกเรียกด้วยอาร์กิวเมนต์ที่ถูกต้อง - หรือทดสอบว่าตัวช่วย method ทำสิ่งที่ควรทำ (ตั้งค่าตัวแปรอินสแตนซ์ / การเปลี่ยนเส้นทาง / ฯลฯ ที่ถูกต้อง)

person zetetic    schedule 01.02.2013
comment
เยี่ยมมาก ขอบคุณ zetetic คำถามของคุณในโพสต์ของฉันช่วยฉันแก้ไขปัญหานี้ได้ - person Huy; 01.02.2013