1

新しい '/etc/udev/rules.d' マッピング ファイルを作成し、udev にサブプロセス呼び出しを行ってデバイス リストを更新する Python コードをいくつか継承しました。

call(['/sbin/udevadm', 'trigger', '--action=change'])

マッピングされているデバイスを抜き差しすることなくマッピングを更新する必要があるため、トリガー呼び出しが必要です。私の問題は、「呼び出し」行がある時点で削除されたため、プログラムの他の部分で明らかでない副作用が発生したため、キャッチされなかったことです。

このような問題を修正する私の通常の方法は、このメソッド (マッピング ファイルを書き込み、トリガーを呼び出す) で単体テストをスローして、期待される動作を強制することですが、この動作は単体テストの領域外のようです。これはシステム コールです。言うまでもなく、udevadm トリガーには sudo アクセスが必要です。この場合、どのように/何をモックアウトするかわかりません。

udevの特定の動作をモックできることがわかったので、pyudevライブラリの使用を検討しましたが、トリガー動作をモックできるようには見えません(または、そのためにアクセスすることさえできません)。

「#DO NOT DELETE THIS LINE EVER!」という大きなメッセージを投げるまではありません。「call」行の上で、これが将来削除されないようにするためにここでできることはありますか? 「削除しないでください」という行は、なぜそこにあるのか誰も手がかりがない1年後など、簡単に無視されます。

4

1 に答える 1

1

この場合、これが私がやることに決めたものです。誰かが私の答えに同意しない場合は、チャイムを鳴らしてください!

それは2つのパートナーです。

最初に、心配していた呼び出しをラップし、コード内でストレートの「呼び出し」をこれに切り替えました。

class UdevWrapper:
    def udevadm_trigger(self):
        call(['/sbin/udevadm', 'trigger', '--action=change'])

(クラスにはこれ以上のものが含まれていますが、わかりやすくするためにここでは簡略化しています)

次に、ラッパーメソッドをモックアウトし、それが呼び出されたことを確認するためにテストしました

@patch.object(utils.UdevWrapper,'udevadm_trigger')
def test_trigger_called(self,mock_udevadm_trigger):
    mock_udevadm_trigger.return_value = True

    # name changed for clarity
    ClassWhereTriggerCalled.func()
    assert mock_udevadm_trigger.called

このようにすることは、ビヘイビア駆動開発について読むことに触発されました。BDDの全体的なアイデアは私にとってまったく新しいので、BDDの支持者が私のソリューションについてどのように感じているかはスタイル的にも機能的にもわかりませんが、私が望んでいたことを実行します-このコード行が削除された場合、何かが明らかに壊れます(私のテスト)将来。

将来的には、状態をチェックできるスタブ関数を作成できるように、モンキーパッチを使用するように切り替える予定です(トリガーが呼び出される順序も重要です)。ただし、原則は同じです。

  1. 嘲笑できる方法で包む
  2. 正しい機能動作を確認するためのテストを作成する
  3. モックラップ方式
于 2012-10-17T17:08:53.280 に答える