我正在尝试使用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'>
有关如何实现这一目标的任何想法?
答案 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)