2013-08-21 50 views
1

我正在使用mock庫修補由兩個文件導入的模塊,這兩個文件定義了一個類及其子類。喜歡的東西:使用相同模擬在兩個不同文件中修改相同的模塊

# ---- file module_to_patch.py ----- 
def foo(): 
    return 1 

def faa(): 
    return 2 

# ---- file base_class.py ----- 
import module_to_patch 

class base_class(object): 
    def __init__(self): 
     self.x = module_to_patch.foo() 

# ---- file sub_class.py ----- 
import module_to_patch 

class sub_class(object): 
    def __init__(self): 
     super(sub_class, self).__init__() 
     self.y = module_to_patch.faa() 

據我瞭解(見here),在我的測試中,我應該修補都base_class.module_to_patchsub_class.module_to_patch,如:

# file test_sub_class.py: 
from unittest import TestCase 
from mock import patch 

class TestSubClass(TestCase): 

    def setUp(self): 
     self.patcher_1 = patch('base_class.module_to_patch', autospec=True) 
     self.mock_1 = self.patcher_1.start() 
     self.patcher_2 = patch('sub_class.module_to_patch', autospec=True) 
     self.mock_2 = self.patcher_2.start() 

    def tearDown(self): 
     patch.stopall() 

問題:

  • 有一個更簡單的方法來實現這個功能?
  • 如果不是 - 兩個補丁都修補相同的實體,我怎樣才能讓兩個修補程序返回相同的Mock()對象?我是否僅僅通過mock_1patcher_2作爲new對象?
  • 上述處理這種情況的正確方法是?

回答

0

實現我認爲你想要做的最簡單的方法就是簡單地模擬導入對象中的模塊。如果你只是想嘲笑整個測試套件模塊:

# file test_sub_class.py: 
from unittest import TestCase 
from mock import Mock 

import sub_class 
import base_class 
MODULE_MOCK = Mock() 
sub_class.module_to_patch = MODULE_MOCK 
base_class.module_to_patch = MODULE_MOCK 

class TestSubClass(TestCase): 

    def test_sub_class_init(self): 
     self.base_class = base_class.base_class() 
     self.assertTrue(MODULE_MOCK.foo.called) 

     self.sub_class = sub_class.sub_class() 
     self.assertTrue(MODULE_MOCK.faa.called) 

如果你只是想嘲笑爲一個測試,你可以使用patch.object作爲裝飾,並給它的模仿對象(MOCK_OBJECT)要補丁。使用對象:

# file test_sub_class.py: 
from unittest import TestCase 
from mock import Mock, patch 

import sub_class 
import base_class 

MOCK_OBJECT = Mock() 

class TestSubClass(TestCase): 

    @patch.object(sub_class, 'module_to_patch', MOCK_OBJECT) 
    @patch.object(base_class, 'module_to_patch', MOCK_OBJECT) 
    def test_sub_class_init(self): 
     self.base_class = base_class.base_class() 
     self.assertTrue(MOCK_OBJECT.foo.called) 
     self.sub_class = sub_class.sub_class() 
     self.assertTrue(MOCK_OBJECT.faa.called) 
相關問題