ฉันใช้ 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
เพื่อเปรียบเทียบค่าสตริงใช้==
เพื่อเปรียบเทียบค่าไม่ใช่ตัวตนของวัตถุ