3

我有类似以下的情况

@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(),但这是一个内部实现细节,使其成为一个脆弱的测试。

如何模拟属性中的默认变量以避免这种情况?

4

1 回答 1

2

我在功能上错误地使用了该库,因为我每次都想要一个新实例时将默认值设置为一个实例。将 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()
于 2018-05-19T14:33:33.370 回答