如何在不覆盖 `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 部分打补丁感到困惑。 我可以修补视图或视图实例的方法,但无论哪种方式,我都不知道假函数如何正确设置视图的 attributething,而不是测试用例。

修补 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