[英]Python mocking function that isn't called directly
在我的 object 中,我有幾個“加載器”函數,用於可能需要加載的不同類型的數據。 它們存儲為:
import foo
import bar
class MyClass
LOADERS = {
'foo': {
'context_manager': False,
'func': foo.data.loader,
'kwargs': {'data_orientation': 'columns'}
},
'bar': {
'context_manager': True,
'func': bar.load_data
'kwargs': {}
}
}
def load_data(self, load_type, path):
func = self.LOADERS[load_type]['func']
kwargs = self.LOADERS[load_type]['kwargs']
if self.LOADERS[load_type]['context_manager']:
with open(path, 'rb') as f:
self.data=func(f, **kwargs)
else:
self.data = func(path, **kwargs)
這在實踐中效果很好,但我發現測試是謀殺。
當我寫我的測試時:
from mock import MagicMock, patch
import sys
sys.modules['foo'] = MagicMock()
sys.modules['bar'] = MagicMock()
from mypackage import MyClass
@patch('foo.data.loader')
def test_load_foo(mock_loader):
my_obj = MyClass()
my_obj.load_data('foo', 'path/to/data')
mock_loader.assert_called_once()
它失敗。 調用 0 次。
我有一半懷疑這是因為它沒有被直接調用。 但這應該不重要。
任何人都可以提供任何建議嗎? 我使用 pytest 作為我的測試引擎,但我發現它在過去與 mock 配合得很好。
謝謝!
出現此問題是因為您嘗試在class屬性而不是實例屬性中修補 function。 行為不一樣。 然而,這確實為我們提供了一些靈活性,因為它是一個class屬性,因此我們可以直接在我們在測試中實例化的 class 上修改 object。
from unittest.mock import MagicMock
from mypackage import MyClass
def test_load_foo():
key_to_test = "foo"
mock_loader = MagicMock()
my_obj = MyClass()
my_obj.LOADERS[key_to_test]["func"] = mock_loader
my_obj.load_data(key_to_test, 'path/to/data')
mock_loader.assert_called_once()
我們沒有嘗試修補 function,而是修改我們的對象實例以使用MagicMock
。
使用這種方法,我收到以下消息:
collected 1 item
tests/test_mypackage.py . [100%]
======================================================================= 1 passed in 0.01s =======================================================================
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.