Python模拟:在要测试的函数中模拟一个函数

时间:2019-09-13 13:04:36

标签: python mocking

我正在尝试使用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()的函数调用,而该函数实际上是我要测试的函数。

我该如何模拟正在测试的函数中内部函数返回的结果?

2 个答案:

答案 0 :(得分:2)

您根本没有嘲笑正确的事情。您要做的就是在测试类中定义MySettings属性 。从来没有任何东西调用它。

您需要在调用MySettings的地方对其进行模拟。假设您要从名为(2 - 6 * 2)= -10的模块中导入2 + 2 - (-10) = 14

```{r , echo=FALSE, results='asis'}
  cat(' Table: (\\#tab:mwe) Example

  | Sepal.Length| Sepal.Width| Petal.Length|
  |------------:|-----------:|------------:|
  |          5.1|         3.5|          1.4|
  |          4.9|         3.0|          1.4|
  |          4.7|         3.2|          1.3|
  |          4.6|         3.1|          1.5|')

```

答案 1 :(得分:1)

您需要的是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