высмеивать расширенные классы в Python - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь смоделировать библиотеку в Python 2.7 и сталкиваюсь с проблемами.То, что я в настоящее время работал, но я хотел бы расширить его, чтобы иметь возможность различать различные вызовы подпроцесса.Я хотел бы сделать это, прочитав второй элемент в моем массиве args, переданный в MockedPopen.У меня проблемы с тем, что у меня нет доступа к этому значению при создании класса stdout внутри MockedPopen.Мой метод до этого момента - макетировать все до whmapicall.stdout.read(), но я не могу передать себя в этот новый класс, потому что значение еще не создано.

class MockedPopen:
    PIPE = None
    def __init__(self, args, **kwargs):
        self.args = args
        self.returncode = 0

    def __enter__(self):
        return self

    def __exit__(self, exc_type, value, traceback):
        pass

    @classmethod
    def Popen(self, cmd , **kwargs):
        return self

    class stdout():
        stdout = '''---
data:
  acct:
    -
      bwusage:
        -
          deleted: 0
          domain: hd.tld
          usage: 771853
      deleted: 0
      limit: '88048926720'
      maindomain: hd.tld
      owner: root
      reseller: 0
      totalbytes: 771853
      user: hd
  month: 9
  reseller: root
  totalused: 232307616
  year: 2019
metadata:
  command: showbw
  reason: OK
  result: 1
  version: 1'''

        @classmethod
        def read(self):
            return self.stdout

Мойкласс теста

 class TestInit:
     @mock.patch('cpquotafix.subprocess', MockedPopen)
     def testUsername(self):
         user = cpquotafix.User("eddy","cthulhu","hd.tld","root",  None ,"10000")
         assert user.username == "eddy"

Код, который я хочу исправить

def setBandwidthLimit(self):
    whmapicall   = subprocess.Popen(["whmapi1" , "showbw", 'searchtype=user', 'search=^%s$' % self.username], stdout=subprocess.PIPE)
    whmapireturn = whmapicall.stdout.read().split("\n")
def setPackageQuota(self):
    whmapicall   = subprocess.Popen(["whmapi1" , "getpkginfo", "pkg=%s" % self.plan], stdout=subprocess.PIPE)
    whmapireturn = whmapicall.stdout.read().split("\n")

1 Ответ

0 голосов
/ 26 сентября 2019

Нет необходимости для stdout быть классом.Вместо этого вы можете сделать stdout свойством и заставить его возвращать объект Mock с атрибутом read, определенным как объект Mock, который при вызове возвращает желаемую строку на основе аргументов, переданных MockedPopen:

class MockedPopen:
    def __init__(self, *args, **kwargs):
        self.args = args

    @property
    def stdout(self):
        return mock.Mock(read=mock.Mock(return_value='''blah blah
metadata:
  command: {}
blah blah'''.format(self.args[1])))
...