2012-11-13 111 views
3

我是相當新的Python開發,我不知道什麼是最好的方式注入模塊的單元測試功能。Python單元測試功能通過使用模擬

我有一個功能,它看起來像:

import exampleModule 

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

在上面的代碼中,我想嘲笑exampleModule.send方法。

我應該將方法作爲參數傳遞給函數嗎?像:

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

而在單元測試我可以通過模擬。但我不希望調用者指定調用方法。

這樣做的正確方法是什麼?

回答

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

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

+0

區別在於,在我的情況下,我沒有測試方法(類中的函數),而是測試高級函數。 – Prasanna