python - 模拟 attr.ib() 的默认值
问题描述
我有类似以下的情况
@attrs(auto_attribs=True)
class ExampleClass:
_prop: OtherClass = attrib(init=False, default=OtherClass())
def some_func(self):
test_var = OtherClass()
test_var.some_func()
self._prop.some_func()
class OtherClass:
def some_func(self):
raise NotImplementedException
def test_example(mocker):
mocker.patch("path.to.example_class.OtherClass")
sut = ExampleClass()
sut.some_func()
所有的类和测试都在不同的文件中,并且 mocker 是 pytest_mock 提供的一个夹具,它只是 unittest.mock 的一个包装器,可以更轻松地进行清理。
我遇到的问题是,在运行单元测试时,test_var 被正确分配为补丁函数中的 MagicMock。所以当 test_var.some_func() 返回时,一切都很好。
当self._prop.some_func()
被调用时,NotImplementedException
由于补丁似乎没有影响这一点,所以会被提升。
在我的单元测试中,我可以设置sut._prop = MagicMock()
,但这是一个内部实现细节,使其成为一个脆弱的测试。
如何模拟属性中的默认变量以避免这种情况?
解决方案
我在功能上错误地使用了该库,因为我每次都想要一个新实例时将默认值设置为一个实例。将 ExampleClass 更改为以下内容可以解决我的问题
@attrs(auto_attribs=True)
class ExampleClass:
_prop: OtherClass = attrib(init=False, factory=lambda: OtherClass())
def some_func(self):
test_var = OtherClass()
test_var.some_func()
self._prop.some_func()
推荐阅读
- css - CSS壁纸视差效果滞后于chrome
- apache-kafka-connect - kafkaconnect 仅使用 java 而不是 confluentcli
- python - Python - Tkinter 框架的配置事件不断触发,回调不断被调用
- python - 在 JSON 列表中添加使用输入创建的字典
- python - 无法让自定义 MySQLOperator 在 Airflow 中工作:带有钩子的 extra_dejson 错误
- angular - 错误:找不到带有路径的控件:'FormArray -> FormControlName' Angular
- functional-programming - 球拍中有参考类型吗?
- java - Gradle:未解决的编译问题:在eclipse中无法解析日志
- angular - 致命错误 C1083:无法打开包含文件:“node_api.h”:\node_modules\bcrypt\build\bcrypt_lib.vcxproj 中没有此类文件或目录
- syntax-highlighting - Geany:在同一个文件中结合 html、css 和 php 的语法高亮显示?