9

私は Sphinx を使用して wxPython に依存するプロジェクトを文書化し、autodocs拡張機能を使用して、docstring からページを自動的に生成します。autodocs拡張機能は、すべてのモジュールで自動的に動作します。これは、パッケージには問題ありませんが、 wxPython のような大規模な外部ライブラリでは問題になります。したがって、wxPython からすべてを生成させる代わりに、ライブラリ モジュール(以前は外部パッケージMock ) を使用しています。最も基本的なセットアップは、wxPython のほとんどの部分で問題なく機能しますが、簡単な方法が見つからない状況に遭遇しました (おそらく、今週までモックに比較的慣れていなかったためです)。importimportunittest.mock

現在、私のconf.pyファイルの最後には次のものがあります。

MOCK_MODULES = ['wx.lib.newevent']  # I've skipped irrelevant entries...

for module_name in MOCK_MODULES:
    sys.modules[module_name] = mock.Mock()

を除くすべての wxPython モジュールでwx.lib.newevent、これは完全に機能します。ただし、ここではnewevent.NewCommandEvent()function[1] を使用して特定のシナリオのイベントを作成しています。この場合、NewCommandEvent()呼び出しに関する警告が表示され、メモが表示されTypeError: 'Mock' object is not iterableます。

単体テストを構築するためにこれを処理するためにパッチを適用する方法はわかりますが(これは来月行う予定です)、Sphinx 構成の単純なレベルでそれを統合する方法を理解するのに苦労しています。 .

編集:私も使っMagicMock()てみました。これは同じポイントでまだエラーを生成しますが、現在はValueError: need more than 0 values to unpack. これは正しい方向への一歩のように思えますが、この 1 つのモジュールに対して明示的に設定する以外に、これを処理する方法がまだわかりません。たぶんそれが最善の解決策ですよね?


脚注

  1. はい、それは関数であり、クラスのように見える命名規則です。wxPython は、wxWidgets ツールキット全体で使用される C++ 命名規則に従います。
4

1 に答える 1

3

エラーから、実際に実行しているように見えるnewevent.NewCommandEvent()ので、コードのどこかに次のようなトップレベルの行があると思います。

import wx.lib.newevent
...
event, binder = wx.lib.newevent.NewCommandEvent()

autodoc がモジュールをインポートすると、このコード行を実行しようとしますが、NewCommandEvent実際にはMockオブジェクトであるため、Python はその出力を(event, binder)タプルにバインドできません。考えられる解決策は 2 つあります。1 つ目は、コードをインポート時に実行されないように変更することif __name__ == '__main__'です。インポート時にこのようなオブジェクトを作成すると、しばしば前兆の副作用が生じる可能性があるため、このソリューションをお勧めします。

Mock2 番目の解決策は、次のように適切な値を返すようにオブジェクトに指示することです。

wx.lib.newevent.NewCommandEvent = mock.Mock(return_value=(Mock(), Mock()))

ただし、返された値を使用してコード内で何かを実行している場合は、同じ問題が発生する可能性があります。

于 2014-01-07T07:44:34.587 に答える