模拟在Python中定义类引用的静态属性

时间:2018-06-20 14:51:47

标签: python unit-testing mocking python-unittest

我在python中有一个这样的类:

class Foo:
    PROP = Bar

    def func(self):
        PROP()

class Bar:
    #some methods

我需要为Foo类编写单元测试,并且需要模拟Bar。以下内容不起作用,因为一旦导入foo模块,Bar就被分配给PROP,而不是其模拟对象:

class Test(unittest.TestCase):
    @patch('foo.Bar', autospec=True)
    def test(self, bar_cls):
        foo = Foo()
        foo.func()   #Initializes the actual Bar object

一些我不习惯使用的解决方案(它们太笨拙)是:

class Test(unittest.TestCase):
    @patch('foo.Bar', autospec=True)
    @patch('foo.Foo.PROP', new_callable=PropertyMock)
    def test(self, mock_prop, bar_cls):
        mock_prop.return_value = bar_cls
        foo = Foo()
        foo.func()

原因:PROP变量可能具有不同的结构(例如,字典),每次编写测试时,我都需要编写相同的结构。因此,如果以后有更改,则所有测试都需要更改。 (使用parse.dict作为上下文管理器的相同原因:太笨拙了)

class Test(unittest.TestCase):
    @patch('foo.Bar', autospec=True)
    def setUp(self, bar_cls):
        Foo.PROP = bar_cls
        self.foo = Foo()  #Run self.foo.func() later

原因:这样做是为了处理大型词典而不是PROP变量,既麻烦又多余。另外,PROP可以是定义为_PROP_的私有类变量。

我已经阅读了一些建议使用实例属性并进行设计考虑的帖子,但是在这种情况下,需要当前设计。

任何见识将不胜感激!

0 个答案:

没有答案