1

我对来自 Javaland 的 python 很陌生。我正在编写一些模块并想独立测试它们。其中一些依赖于其他模块中定义的函数。我想找到一种在运行测试代码时注入测试模块的轻量级方法,并使用它而不是定义这些测试的真实模块。我想出了下面的模式作为实现这一目标的一种手段。

假设我somemodule.py定义了一个函数:

def aFunction:
    return _calculate_real_value_and_do_a_bunch_of_stuff()

foo.py我有一个依赖于该函数的类:

import somemodule

class Foo:
    def bar(self, somemodule=somemodule):
        return 'bar:' + somemodule.aFunction()

在 test_foo.py 中:

import test_foo

def aFunction:
    return 'test_value'

class FooTest(unittest.TestCase:
    def test_bar(self):
        self.assertEquals('bar:test_value',somemodule.aFunction(test_foo))

这适用于将模块注入 Foo.bar,但这是一种好习惯吗?还有其他更好的方法可以测试具有依赖关系的模块吗?

我发现代码可读性很强,并且我在函数的参数中获得了依赖列表的额外好处。我看到的唯一缺点是我对依赖注入 POV 的输入和输出有明确的依赖,somemodulefoo.py可能会闻到?

4

1 回答 1

3

通常的方法是通过猴子补丁。Python 允许你这样做:

import somemodule
somemodule.aFunction = aFunction

现在从 的角度来看foosomemodule.aFunction是您的测试功能。该mock有一个patch装饰器,它做很多相同的事情,但将它包装起来,以便在测试结束时恢复原始文件。

于 2013-09-17T08:51:52.223 回答