在python中模拟扩展类
我试图在Python2.7中模拟一个库,但遇到了一些问题。我目前的工作,但我想扩展它,以便能够区分不同的子流程调用。我想通过读取args数组中的第二个元素来实现这一点,该元素被传递到在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
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调用类型返回不同的数据结构。