如何在不覆盖 `self` 的情况下模拟基于 class 的视图的特定方法?
How to mock a specific method of a class based View without overriding `self`?
我正在尝试在 Django 的 TestCase 中修补视图的功能。我有一个 class:
class BaseView(View):
def _get_data(self):
self.attribute = self.fancy_stuff()
self.thing = self.do_other_stuff()
我需要将 self.attribute 模拟成一个空列表,例如:
_get_data_fake_function():
self.attribute = []
self.thing = True
问题是我在这样的测试用例中:
class MyTests(TestCase):
def setUp(self):
self.view = BaseView
self.view_instance = self.view()
def test_stuff(self):
with patch(self.view) as mock_view:
?
我担心 self
会引用 TestCase 实例,我对如何在 with patch(thing) as name
部分打补丁感到困惑。
我可以修补视图或视图实例的方法,但无论哪种方式,我都不知道假函数如何正确设置视图的 attribute
和 thing
,而不是测试用例。
修补 BaseView
上的 _get_data
方法,使 side_effect
在视图上设置适当的实例变量。
class MyTests(TestCase):
def setUp(self):
self.view = BaseView
with patch.object(self.view, '_get_data', side_effect=view_data_mock):
self.view_instance = self.view()
def test_stuff(self):
self.assertEqual([], self.view_instance.attribute)
self.assertTrue(self.view_instance.thing)
def view_data_mock(view):
view.attribute = []
view.thing = True
我正在尝试在 Django 的 TestCase 中修补视图的功能。我有一个 class:
class BaseView(View):
def _get_data(self):
self.attribute = self.fancy_stuff()
self.thing = self.do_other_stuff()
我需要将 self.attribute 模拟成一个空列表,例如:
_get_data_fake_function():
self.attribute = []
self.thing = True
问题是我在这样的测试用例中:
class MyTests(TestCase):
def setUp(self):
self.view = BaseView
self.view_instance = self.view()
def test_stuff(self):
with patch(self.view) as mock_view:
?
我担心 self
会引用 TestCase 实例,我对如何在 with patch(thing) as name
部分打补丁感到困惑。
我可以修补视图或视图实例的方法,但无论哪种方式,我都不知道假函数如何正确设置视图的 attribute
和 thing
,而不是测试用例。
修补 BaseView
上的 _get_data
方法,使 side_effect
在视图上设置适当的实例变量。
class MyTests(TestCase):
def setUp(self):
self.view = BaseView
with patch.object(self.view, '_get_data', side_effect=view_data_mock):
self.view_instance = self.view()
def test_stuff(self):
self.assertEqual([], self.view_instance.attribute)
self.assertTrue(self.view_instance.thing)
def view_data_mock(view):
view.attribute = []
view.thing = True