拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如果模块在另一个函式Python3中实体化,如何进行单元测验?

如果模块在另一个函式Python3中实体化,如何进行单元测验?

白鹭 - 2022-01-23 2009 0 0

我有一个档案my_work.py该类MyModel在类MyWorkrun方法内部使用假设 的功能MyModel通过其自己的专用单元测验得到了很好的测验。我的重点是测验是否MyModel在内部正确使用MyWork

我需要测验两件事:

  1. 如果MyModel用给定的自变量实体化。
  2. 如果MyModel.run方法被呼叫。因为这是一个漫长而昂贵的程序,我不得不用虚假的回报来嘲笑它。

需要注意的是,这两个类MyModel以及MyWork在同一档案中定义my_work.py这只是这篇文章的一个例子。在我的实际应用程序中,它们是在不同的 py 档案中定义的。不确定这是否会有所作为。

我已经尝试自己为它撰写单元测验,但我做不到。请你帮助我好吗?查看我的测验档案test_my_work.py提前非常感谢!

这是档案:my_work.py.

from typing import Tuple


class MyModel:
    def __init__(self, a: float, b: str):
        self._a = a
        self._b = b

    def run(self) -> Tuple[float, float]:
        # some long and expensive calculation.
        return self._a   1, self._a   2


class MyWork:
    def __init__(self, name: str):
        self._name = name
        self._res_1: float = 0
        self._res_2: float = 0

    def run(self) -> Tuple[float, float]:
        a = 2.5
        b = self._name
        model = MyModel(a=a, b=b)
        res_1, res_2 = model.run()
        return res_1, res_2

这是档案:test_my_work.py.

import unittest
from unittest.mock import patch
from my_work import MyModel, MyWork


class TestMyWork(unittest.TestCase):

    @patch.object(MyModel, 'run', return_value=(3.5, 4.5))
    def test_if_my_model_run_is_called_in_my_work_run(self, mocked_run):
        self._my_work = MyWork(name='XX')
        self._my_work.run()
        mocked_run.assert_called_once()

    @patch.object(MyModel, '__init__')
    def test_if_my_model_is_initiated_in_my_work_run(self, mocked_init):
        self._my_work = MyWork(name='XX')
        self._my_work.run()
        mocked_init.assert_called_once_with(a=2.5, b='XX')


if __name__ == '__main__':
    unittest.main()

uj5u.com热心网友回复:

我建议宁愿使用该patch方法而不是patch.object因为MagicMock 不支持模拟该__init__方法。

对于该patch方法,您需要类的“目标”路径。在这种情况下,它将是'my_work.MyModel'

如果你像这样修补你的模型:

    @patch('my_work.MyModel')
    def test_if_my_model_is_initiated_in_my_work_run(self, my_model_mock):
        ...

然后my_model_mock将是该类的模拟,MyModel并将被替换为MagicMock.

my_model.return_value将在呼叫 的新实体时MyModel呼叫。run然后可以像这样模拟该方法:

        my_model_mock.return_value.run.return_value = (3.5, 4.5)
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *