2021年6月22日火曜日

pytest の monkeypatch で subprocess をパッチする方法

pytest の monkeypatch で subprocess をパッチする方法

概要

タイトルの通り Popen を使って結果を cummnicate() で取得する場合のサンプルを紹介します

環境

  • macOS 11.4
  • Python 3.8.3

サンプルコード

  • vim test_user.py
import pytest
import subprocess
from user.user import User

class DummyProcess():
    def __init__(self):
        self.returncode = 0

    def communicate(self):
        return "hello", None

class TestUser():
    def test_subprocess(self, monkeypatch):
        monkeypatch.setattr(subprocess, "Popen", lambda args, stdout: DummyProcess())
        u = User("hawk", 10)
        ret = u.execute_command()
        assert(ret == "hello")
import subprocess

class User():
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def execute_command(self):
        process = subprocess.Popen(["ls"], stdout=subprocess.PIPE)
        stdoutdata, _ = process.communicate()
        return stdoutdata

ポイント

Popen のリターンとして DummyProcess を返すのがポイントです この DummyProcess クラスに communicate() を実装することで実際にコマンドを実行した結果ではなくダミーの結果を返すことができるようになります

0 件のコメント:

コメントを投稿