不确定您是否需要
patch
在你的情况下。
Patch
更多的人使用“模拟”模块的功能。您可以使用
Mock
对象创建用于测试的结构(使用“模拟”方法和属性)。
首先,我认为你出错是因为你发送了
None
到
构造函数。但是
NoneType
没有
items_dict
所有物
下面是一个可以帮助您的小示例:
from mock import Mock
class Foo(object):
def __init__(self, bar_val):
self.bar = bar_val
def get_bar_items_dict(self):
return self.bar.items_dict
def create_css_for_imgs(self):
return 'example'
class Bar(object):
def __init__(self):
self.items_dict = {}
class TestExample(TestCase):
def test_create_css_for_imgs(self):
bar = Mock(items_dict={'custom': 'dict'})
foo = Foo(bar)
self.assertEqual(
foo.create_css_for_imgs(),
'example'
)
self.assertDictEqual(
foo.get_bar_items_dict(),
{'custom': 'dict'}
)
让我们总结一下。
你出错是因为你试图
items\u目录
属于
没有一个
类型(看起来像:
a = None a.items_dict
)。
您可以创建任何用于测试的对象(使用“模拟”方法和属性),而无需对原始类进行“修补”。示例:
one = Mock(one_propery=1)
two = Mock(one=one)
three = Mock(two=two)
three.my_method.return_value = [1, 2, 3]
print three.two.one.one_propery
print three.my_method()
在某些情况下,我们需要“模拟”类的方法(例如,对于组测试)。在这种情况下,您可以使用
色斑
:
mocked_create = mock.patch(
'your_pack.your_module.Foo.create_css_for_imgs',
return_value='changed example'
)
mocked_create.start()
foo = Foo(Bar())
print foo.create_css_for_imgs()
mocked_create.stop()
希望这有帮助。