bugfix> python > 投稿

次のような状況があります

@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() を設定できましたしかし、これは内部実装の詳細であり、脆弱なテストです。

これを避けるために、attribのデフォルト変数をどのようにモックするのでしょうか?

回答 1 件
  • 毎回新しいインスタンスが必要なときにデフォルトをインスタンスに設定していたため、ライブラリを機能的に誤って使用していました。 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()
    
    

あなたの答え