首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pyscard模拟智能卡响应

使用pyscard模拟智能卡响应
EN

Stack Overflow用户
提问于 2022-10-24 21:00:24
回答 1查看 43关注 0票数 0

我试图使用一些pyscard属性在一个小函数中模拟一个响应。

我的职能:

代码语言:javascript
复制
def card_reader():
    # request any card type
    cardtype = AnyCardType()
    cardrequest = CardRequest(timeout=25, cardType=cardtype)
    cardservice = cardrequest.waitforcard()

    # attach the console tracer
    observer = ConsoleCardConnectionObserver()
    cardservice.connection.addObserver(observer)

    # connect to the card and perform a few transmits
    cardservice.connection.connect()

    try:
        response, sw1, sw2 = cardservice.connection.transmit(ADPU)

    except SWException as e:
        print(str(e))

    cardservice.connection.disconnect()

我的模拟:

代码语言:javascript
复制
@patch("my_module.temp_card_reader.CardRequest")
def test_card_reader(mock_card_request):
    mock_card_request.return_value.connection.transmit.return_value = (200, 201, 203)
    result = card_reader()

使用我的测试,我可以模拟直到cardservice.connection.connect(),但我不能继续返回我想要的值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-24 21:56:10

我一直对莫克斯,MagicMocks和我对他们缺乏了解感兴趣,这就是为什么我对此感到好奇。

我可能完全错了,但我认为正在发生的情况如下:

这个被嘲弄的类是CardRequest.

  • At,有一点,cardservice = cardrequest.waitforcard()

  • Because没有什么(没有副作用,没有return_value.)对于定义了MagicMock)

  • And的.waitforcard(),MagicMock()表示“噢.好的……我想我将在这里返回一个空白的(默认的?) MagicMock”(意思是:当您试图在MagicMock上调用一个未指定的方法时,cardservice是一个默认的MagicMock,它将继续返回MagicMocks.

)。

认为(我已经测试过了,但我不是超级自信,因为我缺少了实际的代码),解决方案是告诉CardRequest模拟的东西,大意是:“嘿,当他们调用.waitforcard()__时,不要返回一个空的(默认的?) MagicMock,而是返回知道如何处理.transmit方法的 mock_cardservice模拟”。

因此,模仿cardservice是可行的:

代码语言:javascript
复制
@patch("my_module.temp_card_reader.CardRequest")
def test_card_reader(mock_card_request):
    mock_cardservice = MagicMock()
    mock_cardservice.connection.transmit.return_value = (200, 201, 203)
    mock_card_request.return_value.waitforcard.return_value = mock_cardservice
    result = card_reader()

有了这个,我就可以看到200 201 203,如果我在cardservice.connection.transmit(ADPU)之后做一个打印

代码语言:javascript
复制
    response, sw1, sw2 = cardservice.connection.transmit(ADPU)
    print(response, sw1, sw2)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74186760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档