首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MagicMock测试方法的内部组件

使用MagicMock测试方法的内部组件
EN

Stack Overflow用户
提问于 2017-07-05 20:57:49
回答 1查看 401关注 0票数 0

我刚开始使用模拟库和单元测试。我想我理解模拟库是如何工作的,但我认为我的方法有问题。

假设我有一个类Foo,它有一个方法addFoo(bar1, bar2)addFoo在foo中调用其他“私有”方法,但也可以在代码的各个部分引发异常.即

代码语言:javascript
复制
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进行单元测试,我将执行以下操作(跳过一系列步骤):

代码语言:javascript
复制
@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中测试异常:

代码语言:javascript
复制
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依赖于方法中的某个数组产生的值时,如何测试它?

EN

回答 1

Stack Overflow用户

发布于 2017-07-09 18:15:20

如果您正在使用吡喃,您可以按以下方式使用断言预期的例外情况

代码语言:javascript
复制
@patch('Foo._getBars', return_value=[])
def test_addFoo_exception(self):
    foo = Foo()
    with pytest.raises(SomeException):
        foo.addFoo(Mock(), Mock())

正如上面的片段所示,通过模拟_getBars,您可以控制返回的内容,因此可以强制执行在代码中触发异常的条件,在本例中为空列表。

我写了一个简短的带有Python中常见单元测试缺陷的post,您可能会发现它很有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44935867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档