我在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_
的私有类变量。
我已经阅读了一些建议使用实例属性并进行设计考虑的帖子,但是在这种情况下,需要当前设计。
任何见识将不胜感激!