【发布时间】:2022-01-10 12:00:24
【问题描述】:
我有一个与 Python unittest.mock.Mock 和 spec_set 功能相关的问题。
我的目标是创建一个具有以下功能的 Mock:
- 它有一个我在创建时决定的任意类的规范。
- 我必须能够根据第 1 点的规范仅分配模拟属性或方法
- Mock 在以下情况下必须引发 AttributeError:
- 我尝试分配一个不在规范中的属性
- 我调用或检索
spec_set中缺少的属性,或spec_set中存在但根据上述点分配的属性。
我想要的一些行为示例:
class MyClass:
property: int = 5
def func() -> int:
pass
# MySpecialMock is the Mock with the functionalities I am dreaming about :D
mock = MyMySpecialMock(spec_set=MyClass)
mock.not_existing # Raise AttributeError
mock.func() # Raise AttributeError
mock.func = lambda: "it works"
mock.func() # Returns "it works"
我尝试了多种解决方案,但没有任何运气,或者没有明确冗长。以下是一些例子:
- 使用
Mock(spec_set=...),但如果我调用未明确设置的特定属性,它不会引发错误 - 使用
Mock(spec_set=...)并使用具有异常副作用的函数显式覆盖每个属性,但这非常冗长,因为我必须重复所有属性...
我的目标是找到一种自动化 2 的方法,但我没有干净的方法来做到这一点。你有遇到过这样的问题,并解决了吗?
对于好奇的人来说,目标是能够增强单元测试的分离性;我想确保只在我明确设置的方法上调用我的模拟,以避免奇怪和意外的副作用。
提前谢谢你!
【问题讨论】:
标签: python unit-testing mocking python-unittest