Python单元测试:模拟字典对象

10

我正在尝试做以下事情:

def test_fn(self):
    cool_dict = {}
    blah = Mock(spec=DictField, wraps=cool_dict)
    blah['key'] = 'val'
    print(cool_dict))
    return False

基本上,我想确保对blah发生的任何事情都允许在一个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

我也使用 MagicMock 进行了尝试:

def test_populate_info_page(self):
    cool_dict = {}
    blah = MagicMock(spec=DictField, wraps=cool_dict)
    blah['key'] = 'val'
    print(cool_dict)
    return False

虽然没有失败,但cool_dict仍然是{}


2
你解决了这个问题吗?我也遇到了类似的问题。 - Ankit Jaiswal
1个回答

2
在Python中,你也可以利用内置的类方法魔法方法。对于dict对象,你需要重写__getitem__()__setitem__()魔法方法。
例如,当你执行语句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
>>> 

因此,在这个示例中,'blah'对象的__getitem__()方法是您将使用Mock()进行模拟的内容,然后您创建了一个副作用:它会触发cool_dict上相同的__getitem__()函数。在调用之后,您可以检查该Mock以查看是否已被调用以及所调用的内容。有关更多上下文,请参见模拟魔术方法

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接