You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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层级:必须先Mockwaitforcard()的返回值,再通过这个返回值获取connection对象,和原函数的调用链完全一致
  • 明确依赖关系:原函数中所有connection的操作都基于waitforcard()返回的cardservice,Mock时要严格对应这个流程
  • 处理ADPU变量:测试环境中要确保ADPU已定义,否则会抛出NameError

内容的提问来源于stack exchange,提问作者Joey Fran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 07:15:41