使用pyscard模拟智能卡响应



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

我的功能:

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()

还有我的模拟:

@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(),但我不能继续返回我想要的值。

我一直对Mocks、MagicMocks很感兴趣,而且我对它们明显缺乏了解😂,这就是为什么我对此感到好奇。

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

  1. 模拟类是CardRequest
  2. 在某一点上,有一个cardservice = cardrequest.waitforcard()
  3. 因为没有为.waitforcard()定义任何东西(没有副作用,没有return_value…(,所以MagicMock((说"哦好吧…我想我会在这里返回一个空白(默认值?(MagicMock">(意思是:cardservice是默认的MagicMock(
  4. 当你试图在MagicMock上调用一个未指定的方法时,它会不断返回MagicMocks

I认为(我已经测试过了,但我不是很有信心,因为我错过了实际的代码(,解决方案是告诉CardRequestmock一些类似以下的东西:;嘿,当他们调用.waitforcard()时,不要返回空白(默认值?(MagicMock,而是THISmock_cardservicemock,它知道如何处理.transmit方法">

因此,嘲笑cardservice可能会奏效:

@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()

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

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

相关内容

  • 没有找到相关文章

最新更新