我有一个基类,定义了一个类属性和一些依赖于它的子类,例如:
class Base(object):
assignment = dict(a=1, b=2, c=3)
我希望能够使用不同的分配(例如空字典、单个项目等)对这个类进行单元测试。当然,这极其简化,不是重构我的类或测试的问题。
我想到的(pytest)测试最终是可行的。
from .base import Base
def test_empty(self):
with mock.patch("base.Base.assignment") as a:
a.__get__ = mock.Mock(return_value={})
assert len(Base().assignment.values()) == 0
def test_single(self):
with mock.patch("base.Base.assignment") as a:
a.__get__ = mock.Mock(return_value={'a':1})
assert len(Base().assignment.values()) == 1
这感觉相当复杂和hacky - 我甚至不完全理解它为什么有效(虽然我熟悉描述符)。mock是否自动将类属性转换为描述符?
一个更合乎逻辑的解决方案并不起作用:
def test_single(self):
with mock.patch("base.Base") as a:
a.assignment = mock.PropertyMock(return_value={'a':1})
assert len(Base().assignment.values()) == 1
或者只是
def test_single(self):
with mock.patch("base.Base") as a:
a.assignment = {'a':1}
assert len(Base().assignment.values()) == 1
我尝试过的其他变体也都不起作用(测试中分配保持不变)。
模拟类属性的正确方法是什么?有比上面这种更好/更易懂的方法吗?
Bar.assignment
是一个模拟吗? - Martijn PietersPropertyMock
没有起作用。 - Martijn PietersBar.assignment.__get__ = lambda: {'a': 1}
;那是行不通的,因为__get__
方法需要接受self
、obj
和type_
参数。Mock对象至少对其可调用函数使用了*args, **kwargs
签名。 - Martijn Pieters