Python单元测试函数使用模拟

时间:2012-11-13 19:03:00

标签: python unit-testing mocking

我对python开发相当新,我不确定将mocks注入单元测试函数的最佳方法是什么。

我的功能如下:

import exampleModule

def func():
    ls = createList()
    exampleModule.send(ls)

在上面的代码中,我想模拟exampleModule.send方法。

我应该将该方法作为参数传递给函数吗?像:

def func(invokeMethod):
    ls = createList()
    invokeMethod(ls)

在单元测试中,我可以通过模拟。但我不希望调用者指定调用方法。

这样做的正确方法是什么?

2 个答案:

答案 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