模拟 attr.ib() 的默认值
Mocking default values of 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()
所有 类 和测试都在不同的文件中,模拟器是由 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()
我的情况类似下面
@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()
所有 类 和测试都在不同的文件中,模拟器是由 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()