3

我对 python 开发相当陌生,我不确定将模拟注入到单元测试函数中的最佳方法是什么。

我有一个看起来像这样的函数:

import exampleModule

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

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

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

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

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

正确的做法是什么?

4

2 回答 2

2

您可以使用Michael Foord 的模拟库,它是 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,它可能会满足你在模拟/存根中的所有需求。

于 2012-11-13T19:41:17.613 回答
1

Python 支持函数作为一等公民,因此您可以覆盖方法的实现以进行单元测试。

这种方法基本上向您展示了方法。

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 中,您可以使用内置的模拟支持

于 2012-11-13T19:15:08.370 回答