我正在尝试使用一些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很感兴趣,而且我对它们明显缺乏了解😂,这就是为什么我对此感到好奇。
我可能完全错了,但我认为正在发生的事情如下:
- 模拟类是
CardRequest
- 在某一点上,有一个
cardservice = cardrequest.waitforcard()
- 因为没有为
.waitforcard()
定义任何东西(没有副作用,没有return_value…(,所以MagicMock((说"哦好吧…我想我会在这里返回一个空白(默认值?(MagicMock">(意思是:cardservice
是默认的MagicMock( - 当你试图在MagicMock上调用一个未指定的方法时,它会不断返回MagicMocks
I认为(我已经测试过了,但我不是很有信心,因为我错过了实际的代码(,解决方案是告诉CardRequest
mock一些类似以下的东西:;嘿,当他们调用.waitforcard()
时,不要返回空白(默认值?(MagicMock,而是THISmock_cardservice
mock,它知道如何处理.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)