簡體   English   中英

Python模擬:在要測試的函數中模擬一個函數

[英]Python Mock: Mocking a function inside the function I'm testing

我正在嘗試使用Mock測試從檢索設置的函數返回的結果:

def apply_delta_to_date(original_date):
    delta = MySettings.get_delta()
    result_date = original_date + timedelta(delta)
    return result_date

在測試apply_delta_to_date函數時,我正在嘗試模擬對MySettings.get_delta的調用,以模擬其返回特定結果的情況:

class TestAppyDelta():
    def setUp(self):
        self.MySettings = Mock()
        self.MySettings.get_delta = Mock(return_value=10)

    def test_apply_delta(self):
        result = apply_delta_to_date(today)

問題是我無法“模擬”對MySettings.get_delta()的函數調用,該函數位於我真正要測試的函數中。

如何模擬正在測試的函數中內部函數返回的結果?

您根本沒有嘲笑正確的事情。 您要做的就是在測試類中定義MySettings屬性。 從來沒有任何東西調用它。

您需要在調用MySettings的地方對其進行模擬。 假設你要導入apply_delta_to_date從一個名為模塊my_delta_module

@patch('my_delta_module.MySettings')
def test_apply_delta(self, mock_settings):
    mock_settings.get_delta.return_value = 10
    result = apply_delta_to_date(today)

您需要的是patch.object上下文管理器,它可以完全滿足您的要求:它使用一個類和方法,並允許您定義自定義返回值。

from unittest.mock import patch
from <your-time_utils-module> import apply_delta_to_date, MySettings


class TestAppyDelta():
    def test_apply_delta(self):
        with patch.object(MySettings, 'get_delta', return_value=10) as mock_method:
            result = apply_delta_to_date(today)

            # mock_method has many other useful assertions
            mock_method.assert_called_once()

有關更多詳細信息,請參考文檔https://docs.python.org/3/library/unittest.mock.html#quick-guide

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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