我有一个基类,它定义了一个类属性和一些依赖它的子类,例如
class Base(object):
assignment = dict(a=1, b=2, c=3)
Run Code Online (Sandbox Code Playgroud)
我想用不同的任务对这个类进行单元测试,例如空字典,单项等.当然,这非常简化,不是重构我的类或测试的问题.
我得到的(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
Run Code Online (Sandbox Code Playgroud)
这感觉相当复杂和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
Run Code Online (Sandbox Code Playgroud)
要不就
def test_single(self):
with mock.patch("base.Base") as a:
a.assignment = {'a':1}
assert len(Base().assignment.values()) == 1
Run Code Online (Sandbox Code Playgroud)
我尝试过的其他变种也不起作用(测试中的作业保持不变).
模拟类属性的正确方法是什么?有没有比上面更好/更容易理解的方式?