Dan*_*Bak 9 python python-unittest
我正在尝试执行以下操作:
def test_fn(self):
cool_dict = {}
blah = Mock(spec=DictField, wraps=cool_dict)
blah['key'] = 'val'
print(cool_dict))
return False
Run Code Online (Sandbox Code Playgroud)
基本上,我想确保blaha 允许发生的任何事情DictField,但我希望发生的任何事情blah实际发生在cool_dict,因此我可以看到断言它具有某种状态。
我怎样才能做到这一点?上面的代码失败:
FAILED (errors=1)
Error
Traceback (most recent call last):
File "C:\Program Files\Python 3.5\Lib\unittest\case.py", line 59, in testPartExecutor
yield
File "C:\Program Files\Python 3.5\Lib\unittest\case.py", line 605, in run
testMethod()
File "C:\Users\danie01.AD\PycharmProjects\component\component\Default\Functional\pam_team_management\test\test_team_create.py", line 23, in test_populate_info_page
blah['key'] = 'val'
TypeError: 'Mock' object does not support item assignment
Run Code Online (Sandbox Code Playgroud)
我也尝试过MagicMock:
def test_populate_info_page(self):
cool_dict = {}
blah = MagicMock(spec=DictField, wraps=cool_dict)
blah['key'] = 'val'
print(cool_dict)
return False
Run Code Online (Sandbox Code Playgroud)
哪个没有失败,但cool_dict仍然是 {}
在Python中,您还可以使用魔术方法,它们是类的内置方法。对于dict对象,您需要重写__getitem__()和__setitem__()magic 方法。
举个例子,当你做出声明时blah['key'] = 'var',它实际上是在调用blah.__setitem__('key', 'var')。因此,您需要模拟这两个魔术方法,然后检查这些模拟方法的状态。
这是我如何尝试您正在谈论的内容的示例:
>>> cool_dict = {'key': 'val'}
>>> blah = Mock()
>>> blah.__getitem__ = Mock()
>>> blah.__getitem__.side_effect = cool_dict.__getitem__
>>> blah['key']
'val'
>>> blah.__getitem__.assert_called() # No assertion raised, which means that it was called
>>>
Run Code Online (Sandbox Code Playgroud)
因此,在这个例子中,__getitem__()“blah”对象的方法是您将使用 aMock()来模拟的东西,然后您创建了一个副作用:它__getitem__()在cool_dict. 调用之后,您可以检查该 Mock 以查看它是否被调用以及调用的内容。有关更多上下文,请参阅模拟魔术方法。