模拟类与原始规格Python

时间:2018-05-02 15:23:22

标签: python unit-testing mocking python-unittest

我正在尝试使用Mock package在Python中模拟一个类,特别是在测试类中使用patch decorator

from unittest import TestCase
from unittest.mock import Mock, patch

@patch("mypackage.subpackage.mymodule", autospec=True)
class MyClassTest(TestCase):
    def setUp(self):
        [...]

    def test_with_boundary_creates_job_flow_task(self):
        returned_value = self.some_class.return_something_from_my_module()

        self.assertIsInstance(returned_value, expected_value_class)

我希望我的模拟器具有被模拟的类的原始行为,即除非我专门模拟属性/方法,否则它应该像提供的类一样(具有逻辑和放大器)。返回值)。

因此,在测试非模拟方法但在原始类中测试现有方法时,测试应该成功运行而不是失败并出现以下(特定)错误:

AssertionError: <class 'unittest.mock.MagicMock'> is not an instance of <class 'airflow.contrib.operators.emr_create_job_flow_operator.EmrCreateJobFlowOperator'>

有关如何实现这一目标的任何想法?

2 个答案:

答案 0 :(得分:1)

出现此错误的原因是因为模块是模拟的,而不是类

AssertionError: <class 'unittest.mock.MagicMock'> is not an instance of 
<class ...EmrCreateJobFlowOperator'>

更改

@patch("mypackage.subpackage.mymodule"

@patch("mypackage.subpackage.mymodule.SomeClass"
  

我希望我的模拟使该类的原始行为被嘲笑,

我担心它是另一种方式,这将创建一个App的实例,其中所有方法和属性都被模拟,只有当你想要模拟类{em} __init__时才有用一种方法(或两种)

mock_app = MagicMock(name='App', spec=App)
mock_app.method_one.return_value = whatever
  

我专门模拟属性/方法method_one,而app除了method_one

外,其他所有内容都是真实的
mock_app = MagicMock(name='App', 'method_one', spec=App)
mock_app.method_one.return_value = 'mocked value'
app = App()

简而言之,您的补丁将是

  from airflow.contrib.operators.emr_create_job_flow_operator import EmrCreateJobFlowOperator
  @patch.object(EmrCreateJobFlowOperator, 'the_method')

答案 1 :(得分:0)

我这样嘲笑:

from mypackage.subpackage.mymodule import MyClass

class MyClassTest(TestCase):
    def setUp(self):
        [...]

    @patch.object(MyClass, 'method_to_mock', autospec=True)
    def test_with_boundary_creates_job_flow_task(self, mock_method):
        mock_method.return_value = expected_value_class() # Can use a stub
        returned_value = self.some_class.return_something_from_my_module()

        self.assertIsInstance(returned_value, expected_value_class)