5/11/2013

Mock object ที่ถูกสร้างใน method

โจทย์ของผมคือต้องใช้ Popen module subprocess แต่มีปัญหาว่าเราจะ mock ยังไงในเมื่อมันไป new object ใน method ไม่ได้มาจากการ inject ผ่าน constructor หรือ setter แต่อย่างใด ก็เลยเกิดไอเดียจากการนั่งอ่าน stackoverflow ทำให้เห็นภาพเป็นประมาณนี้



จากที่เห็นเราต้องสร้าง class MockPopen เพื่อเอามา mock ก่อนจากนั้นก็จัดการ mock method และ getter ต่อมาก็คือใช้ setattr เพื่อหลอกว่า Popen คือ MockPopen ที่เราสร้างขึ้น เมื่อ class Process เรียกใช้ก็ยังเห็นว่ามันเป็น Popen และที่เราเทสนั้นก็ยังกำหนด return_value และยังสามารถ verify ได้ว่า method ได้ถูก call หรือไม่