1

我想模拟一个类方法的输出,它由不同模块中定义的函数调用。例如:

类模块.py

class my_class:
    def __init__(self, user):
        self.user = user

    def my_method(self):
        return [1,2,3]
    
    def other_methods(self):
        other_func(self.user)
        return "something I do not really want to mock"

函数模块.py

from class_module import my_class

def my_fun():
    user = "me"
    foo = my_class(user)
    foo.other_methods()
    return foo.my_method()

测试.py

@patch("function_module.my_class")
def test_my_fun(class_mock):
    class_mock.return_value.my_method.return_value = []
    bar = my_fun()

    assert bar == []

但是,我得到一个AssertionError说法[1,2,3] != []。所以我想模拟永远不会发生在我想要的方法上。有人可以解释怎么做吗?为什么会这样?

编辑

实际上,显示的实现不起作用,因为测试正在启动一个完全独立的过程。因此,不能模拟任何函数。对不起我的误解

4

1 回答 1

0

patch.object允许修补类的特定方法。

类模块.py

class MyClass:
    def __init__(self, user):
        self.user = user

    def my_method(self):
        return [1, 2, 3]

    def other_methods(self):
        return "anything"

函数模块.py

from class_module import MyClass


def my_fun():
    user = "me"
    foo = MyClass(user)
    assert foo.other_methods() == "anything"
    return foo.my_method()

test_my_func.py

from unittest.mock import patch

from class_module import MyClass
from function_module import my_fun


@patch.object(MyClass, "my_method")
def test_my_fun(my_method):
    # given
    any_value = [99, 98, 97]
    my_method.return_value = any_value

    # when
    result = my_fun()

    # then
    assert result == any_value

有了这些文件,pytest test_my_func.py就顺利通过了。

于 2020-12-26T08:35:38.603 回答