ฉันใช้ pythons mock.patch และต้องการเปลี่ยนค่าตอบแทนสำหรับการโทรแต่ละครั้ง นี่คือข้อแม้: ฟังก์ชันที่กำลังแก้ไขไม่มีอินพุตดังนั้นฉันจึงไม่สามารถเปลี่ยนค่าส่งคืนตามอินพุตได้
นี่คือรหัสของฉันสำหรับการอ้างอิง
def get_boolean_response():
response = io.prompt('y/n').lower()
while response not in ('y', 'n', 'yes', 'no'):
io.echo('Not a valid input. Try again'])
response = io.prompt('y/n').lower()
return response in ('y', 'yes')
รหัสทดสอบของฉัน:
@mock.patch('io')
def test_get_boolean_response(self, mock_io):
#setup
mock_io.prompt.return_value = ['x','y']
result = operations.get_boolean_response()
#test
self.assertTrue(result)
self.assertEqual(mock_io.prompt.call_count, 2)
io.promptเป็นเพียง "อิสระ" ของแพลตฟอร์ม (python 2 และ 3) ดังนั้นในที่สุดฉันพยายามเยาะเย้ยการป้อนข้อมูลของผู้ใช้ ฉันได้ลองใช้รายการสำหรับค่าส่งคืนแล้ว แต่นั่นก็ไม่ได้ทำงานได้ดี
คุณสามารถเห็นได้ว่าถ้าค่าส่งคืนเป็นสิ่งที่ไม่ถูกต้องฉันจะได้รับการวนซ้ำไม่สิ้นสุดที่นี่ ดังนั้นฉันต้องการวิธีที่จะเปลี่ยนค่าตอบแทนในที่สุดเพื่อให้การทดสอบของฉันเสร็จสิ้น
(อีกวิธีหนึ่งที่เป็นไปได้ในการตอบคำถามนี้อาจเป็นการอธิบายวิธีที่ฉันสามารถเลียนแบบการป้อนข้อมูลผู้ใช้ในการทดสอบหน่วย)
ไม่ใช่ความซ้ำซ้อนของคำถามนี้ส่วนใหญ่เพราะฉันไม่มีความสามารถในการเปลี่ยนแปลงอินพุต
หนึ่งในความคิดเห็นของคำตอบสำหรับคำถามนี้อยู่ในบรรทัดเดียวกัน แต่ไม่มีการให้คำตอบ / ความคิดเห็น
isเพื่อเปรียบเทียบตัวอักษรสตริง อย่าทำอย่างนั้น ความจริงที่ว่ามันใช้งานได้ (บางครั้ง) เป็นเพียงรายละเอียดการใช้งานใน CPython นอกจากนี้response is not 'y' or 'n' or 'yes' or 'no'อาจจะไม่ทำในสิ่งที่คุณคิดว่ามันคือ ...
response is not 'y' or 'n' or 'yes' or 'no'ในการไม่ทำสิ่งที่คุณคิด ดูฉันจะทดสอบตัวแปรหนึ่งตัวกับหลายค่าได้อย่างไร และคุณไม่ควรใช้isเพื่อเปรียบเทียบค่าสตริงใช้==เพื่อเปรียบเทียบค่าไม่ใช่ตัวตนของวัตถุ