【问题标题】:How to replace a method during testing in Python?如何在 Python 测试期间替换方法?
【发布时间】:2019-05-14 00:36:22
【问题描述】:

我试图在测试期间替换方法函数。原来的方法比较复杂,所以我想在测试中用一个简单的函数来代替它。

我尝试过使用模拟库。但看起来它只修改了在测试用例中直接创建的对象。如果测试用例中的一些其他函数调用了该方法,则该方法不会被替换。


class1.py:

class Class1:
    def foo(self):
        #do a lot of calculation
        return 1

class2.py:

from .class1 import Class1

class Class2:
    def doo(self):
        my_class1 = Class1()
        return my_class1.foo()

test.py:

import mock
from .class1 import Class1
from .class2 import Class2

class Class1:
    def foo(self):
        # no calculation
        return 2

@mock.patch.object(Class1, "foo")
def test_case(mock):
    my_class2 = Class2()
    assert my_class2.doo() == 2

我正在尝试将 Class1 中的 foo() 替换为在 test.py 中创建的新 foo()。但是因为Class1对象是在Class2对象内部创建的,所以方法不是这样替换的`

【问题讨论】:

    标签: python python-3.x unit-testing testing python-mock


    【解决方案1】:

    你必须嘲笑正确的事情。 Class2.doo 创建 class2.Class1 的实例,而不是 test.Class1(名称是模拟时的重要内容,class2test 都有自己的全局范围)。

    import mock
    import class2
    
    
    @mock.patch.object(class2.Class1, 'foo', return_value=2)
    def test_case(mock):
        my_class2 = class2.Class2()
        assert my_class2.doo() == 2
    

    【讨论】:

    • 谢谢,这行得通!但是当我使用 pytest 运行时,我不断收到模块未找到问题。但我想这是另一个问题。
    • 我使用import class2 只是为了让导入在我的测试中工作;您可能需要使用 import .class2 与您之前使用的一致。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多