我刚开始使用模拟库和单元测试。我想我理解模拟库是如何工作的,但我认为我的方法有问题。
假设我有一个类Foo,它有一个方法addFoo(bar1, bar2)和addFoo在foo中调用其他“私有”方法,但也可以在代码的各个部分引发异常.即
class Foo:
def __init__(self):
# This creates lots of dependencies
def _inner1(self, bar):
if this_doesnt_work:
return None
return modified_bar1
def _inner2(self, bar2):
if this_doesnt_work:
return None
return modified_bar2
def addFoo(bar1, bar2):
if self._inner1(bar1) and self._inner2(bar2):
#do something
else:
raise SomeException当我进行单元测试时,我目前所做的是在我的单元测试设置中模拟出Foo.__init__,并将return_value设置为None。这是可行的,并且允许我在没有所有外部依赖项的情况下对类中的方法运行测试,只需使用模拟的Foo.__init__实例来模拟任何类属性。
完成之后,如果我想要对addFoo进行单元测试,我将执行以下操作(跳过一系列步骤):
@patch.object(Foo, '_inner2')
@patch.object(Foo, '_inner1')
def test_inner1_exception(self, mock_inner1, mock_inner2):
mock_inner1.side_effect = Exception
# then do some asserts to make sure it worked如果代码如下所示,问题如何在addFoo中测试异常:
def addFoo(bar1, bar2):
bars = self._getBars() #something that returns a list
my_modified_bar_list = []
for bar in bars:
my_modified_bar_list.append(self._inner1(bar))
if len(my_modified_bar_list) == 0:
raise SomeException在这个例子中,当SomeException依赖于方法中的某个数组产生的值时,如何测试它?
发布于 2017-07-09 18:15:20
如果您正在使用吡喃,您可以按以下方式使用断言预期的例外情况:
@patch('Foo._getBars', return_value=[])
def test_addFoo_exception(self):
foo = Foo()
with pytest.raises(SomeException):
foo.addFoo(Mock(), Mock())正如上面的片段所示,通过模拟_getBars,您可以控制返回的内容,因此可以强制执行在代码中触发异常的条件,在本例中为空列表。
我写了一个简短的带有Python中常见单元测试缺陷的post,您可能会发现它很有用。
https://stackoverflow.com/questions/44935867
复制相似问题