2015-08-27 60 views
-1

我有興趣修補在另一個文件中被另一個方法調用的方法。示例 - original.py文件包含 -修補python類以外的方法

def A(): 
    a = 10 
    b = 5 
    return a*b; 

def B(): 
    c = A() 
    return c* 10 

我想寫這個文件的單元測試,比如說把它test.py了

import mock 
import unittest 

class TestOriginal(unitest.TestCase): 
    def test_Original_method(self): 
     with patch(''): 

如何使用補丁和模擬模塊考試原。 PY。我希望A()始終返回MagicMock()對象而不是整數。

+0

'patch'是不是一個模塊。您是否閱讀過「mock」文檔,哪部分不清楚? –

+0

我的壞意思是修補程序修飾器和模擬模塊。 – psbits

回答

1

您只需在被測模塊中修補A global。我想在這裏使用的@patch裝飾語法:

import mock 
import unittest 
import module_under_test 

class TestOriginal(unitest.TestCase): 
    @patch('module_under_test.A') 
    def test_Original_method(self, mocked_A): 
     mocked_A.return_value = 42 
     result = module_under_test.B() 
     mocked_A.assert_called_with() 
     self.assertEqual(result, 420) 

這通過在MagicMock模擬對象爲A()作爲一個額外的參數的測試方法。

請注意,我們在這裏明確命名模塊。你也可以使用patch.object(),只是命名模塊上的屬性(這是你的模塊全局):

class TestOriginal(unitest.TestCase): 
    @patch.object(module_under_test, 'A') 
    def test_Original_method(self, mocked_A): 
     mocked_A.return_value = 42 
     result = module_under_test.B() 
     mocked_A.assert_called_with() 
     self.assertEqual(result, 420) 

,您仍然可以使用with聲明過,當然:

class TestOriginal(unitest.TestCase): 
    def test_Original_method(self): 
     with patch('module_under_test.A') as mocked_A: 
      mocked_A.return_value = 42 
      result = module_under_test.B() 
      mocked_A.assert_called_with() 
      self.assertEqual(result, 420)