我对python开发相当新,我不确定将mocks注入单元测试函数的最佳方法是什么。
我的功能如下:
import exampleModule
def func():
ls = createList()
exampleModule.send(ls)
在上面的代码中,我想模拟exampleModule.send
方法。
我应该将该方法作为参数传递给函数吗?像:
def func(invokeMethod):
ls = createList()
invokeMethod(ls)
在单元测试中,我可以通过模拟。但我不希望调用者指定调用方法。
这样做的正确方法是什么?
答案 0 :(得分:2)
您可以使用Michael Foord的mock库,这是Python 3的一部分。它使这种模拟非常方便。一种方法是:
>>> from mock import patch
>>> import exampleModule
>>>
>>> def func():
... ls = []
... exampleModule.send(ls)
...
>>> with patch('exampleModule.send') as send:
... func()
... assert send.called
这里我们将它用作上下文管理器。但是你也可以使用patch
作为装饰者。但是有更多方法可以使用mock
,它可能会满足您在模拟/存根中的所有需求。
答案 1 :(得分:1)
Python支持函数作为一等公民,因此您可以覆盖方法的实现以进行单元测试。
This approach basically shows you the way.
class Foo
def thing_to_mock():
really_expensive_stuff()
def thing_to_test():
i = 1 + 2
thing_to_mock()
return i
class FooTest
def testingThingToTest():
def mocker():
pass
toTest = Foo()
toTest.thing_to_mock = mocker
# assert here
或者,在Python 3.3中,您可以使用built-in mocking support。