簡體   English   中英

未直接調用的 Python mocking function

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM