使用pyscard模拟智能卡响应遇阻:Mock无法返回预期值
问题原因
你的Mock层级没对应上原函数的调用流程。原函数里cardservice是cardrequest.waitforcard()返回的对象,而你直接给CardRequest实例挂了connection属性,跳过了waitforcard()这一步,导致代码执行到cardservice.connection时找不到正确的Mock对象。
修复后的测试代码
from unittest.mock import patch, MagicMock from your_module import card_reader # 替换成你的实际模块路径 @patch("my_module.temp_card_reader.CardRequest") def test_card_reader(mock_card_request): # 1. 创建Mock的cardservice对象 mock_cardservice = MagicMock() # 让CardRequest实例的waitforcard()返回这个mock对象 mock_card_request.return_value.waitforcard.return_value = mock_cardservice # 2. 配置connection的方法返回值 mock_connection = mock_cardservice.connection mock_connection.transmit.return_value = (200, 201, 203) # connect和disconnect用MagicMock默认的空实现就行,不需要额外配置 # 3. 确保测试时ADPU变量可用(如果是模块级变量,提前定义或Mock) global ADPU ADPU = [0x00, 0xA4, 0x04, 0x00, 0x0A] # 替换成你实际用的APDU指令 # 执行被测函数 card_reader() # 可选:验证方法调用是否符合预期 mock_connection.connect.assert_called_once() mock_connection.transmit.assert_called_once_with(ADPU) mock_connection.disconnect.assert_called_once()
核心修正点
- 补全Mock层级:必须先Mock
waitforcard()的返回值,再通过这个返回值获取connection对象,和原函数的调用链完全一致 - 明确依赖关系:原函数中所有
connection的操作都基于waitforcard()返回的cardservice,Mock时要严格对应这个流程 - 处理ADPU变量:测试环境中要确保
ADPU已定义,否则会抛出NameError
内容的提问来源于stack exchange,提问作者Joey Fran
相关产品推荐
相关产品推荐

