Python 如何在不重写“self”的情况下模拟基于类的视图的特定方法?

Python 如何在不重写“self”的情况下模拟基于类的视图的特定方法?,python,django,python-3.x,django-class-based-views,django-unittest,Python,Django,Python 3.x,Django Class Based Views,Django Unittest,我试图在django的测试用例中修补视图的函数。我有一门课: 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 = []

我试图在django的测试用例中修补视图的函数。我有一门课:

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实例,我不知道如何在
中使用patch(thing)作为name
部分进行修补。
我可以修补视图或视图实例的方法,但无论如何,我都不知道fake函数如何正确设置视图的
属性
东西
,不是测试用例。

BaseView
上修补
\u get\u data
方法,以产生
副作用,从而在视图上设置适当的实例变量

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

您是否尝试过修补
fancy_stuff
以返回空列表?尝试过之后,我意识到我必须修补这两个东西
\u获取数据
does您可以根据需要命名该
self
变量。它被称为“自我”
,只是一种惯例。如果愿意,可以将其命名为
this
,或
that
,或
任意一种方法。无论哪种方法,它都会将TestCase实例设置为属性,而不是视图。查看应如何在
BaseView
上设置
self.thing
,但是测试类中的补丁会在测试中设置它们class@codyc4321我在下面添加了一个答案,让我知道它是否有效/如果你还有其他问题