在python中模拟扩展类

在python中模拟扩展类,python,python-2.7,python-mock,Python,Python 2.7,Python Mock,我试图在Python2.7中模拟一个库,但遇到了一些问题。我目前的工作,但我想扩展它,以便能够区分不同的子流程调用。我想通过读取args数组中的第二个元素来实现这一点,该元素被传递到MockedPopen。我的问题是,在MockedPopen内部创建类stdout时,我没有访问该值的权限。到目前为止,我的方法是模拟所有内容,直到whmapicall.stdout.read(),但我似乎无法将self传递到这个新类中,因为该值尚未创建 class MockedPopen: PIPE = N

我试图在Python2.7中模拟一个库,但遇到了一些问题。我目前的工作,但我想扩展它,以便能够区分不同的子流程调用。我想通过读取args数组中的第二个元素来实现这一点,该元素被传递到
MockedPopen
。我的问题是,在
MockedPopen
内部创建类
stdout
时,我没有访问该值的权限。到目前为止,我的方法是模拟所有内容,直到
whmapicall.stdout.read()
,但我似乎无法将self传递到这个新类中,因为该值尚未创建

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")
我要修补的代码

 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")

stdout
不需要成为类。您可以将
stdout
改为属性,并使其返回一个
Mock
对象,该对象具有定义为
Mock
对象的
read
属性,该对象在调用时根据传递给
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])))

我的问题是,我想根据传递到mock_popen
if self.args[1]='showbw':
if self.args[1]=='getpkginfo'
或传递到subprocess.popen的第一个列表来更改返回值。理想情况下,我希望根据进行的API调用类型返回不同的数据结构。