首页 > 解决方案 > 如何模拟没有为 Python 单元测试设置类属性的参数的函数?

问题描述

我的类 Foo 有一个不带参数的计算方法,调用数据库并使用类属性进行一些计算,并设置另一个类属性calculation_results(它是一个字典)。

我正在尝试模拟一个单独的函数,其中包括对 Foo.calculate() 的调用。

我尝试了类似下面的方法,其中 mock_calculate 是我的测试类中定义的一个函数:

def mock_calculate():
    pass

@mock.patch("path.Foo.validate", new=mock_calculate)
@mock.patch("path.Foo")
def test_func_that_calls_foo(self, mock_foo):
    mock_foo.return_value.calculation_results = {first_calc : 1, second_calc: 2, database_mismatches : []}
    func_that_calls_foo(#TEST_INPUT)
    #assertions

这段代码确实设置了calculation_result 属性,但它仍然调用了实际的计算函数,当它尝试访问数据库时该函数失败了。如何直接设置 Foo.calculation_results 而不实际调用 calculate()?calculate() 不接受参数或返回任何东西的事实使得很难遵循我看到的大多数模拟示例——否则我可以只设置一个 return_value 或者在函数内部根据传递的参数设置属性。

标签: pythonmocking

解决方案


推荐阅读