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()

すべてのクラスとテストは異なるファイルにあり、モッカーは 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 に答える