python - 在 Python 中模拟子进程调用
问题描述
我正在尝试mock.patch
在模拟库中使用装饰器,但遇到了问题。我有这个初始化函数,我在其中进行了两个子进程调用。第一次进入self.setPackageQuota()
,第二次进入self.setBandwidthLimit()
。
class User():
def __init__(self, username, plan, domain, owner, diskQuota, diskUsed):
self.setUsername(username)
self.setPlan(plan)
self.setDomain(domain)
self.setOwner(owner)
self.setDiskQuota(diskQuota)
self.setDiskUsed(diskUsed)
self.setPackageQuota()
self.setBandwidthLimit()
self.setPackageQuota()
def setBandwidthLimit(self):
whmapicall = subprocess.Popen(["whmapi1" , "showbw", 'searchtype=user', 'search=^%s$' % self.username], stdout=subprocess.PIPE)
whmapireturn = whmapicall.stdout.read().split("\n")
for line in whmapireturn:
self.setPackageQuota()
def setPackageQuota(self):
whmapicall = subprocess.Popen(["whmapi1" , "getpkginfo", "pkg=%s" % self.plan], stdout=subprocess.PIPE)
whmapireturn = whmapicall.stdout.read().split("\n")
for line in whmapireturn:
我宁愿补丁whmapireturn
成为别的东西。我也不想不跑subprocess.Popen
。我最初的想法是修补@mock.patch('subprocess.Popen', MockedClass)
,@mock.patch('whmapireturn', OtherMockedClass)
但我似乎无法让它发挥作用。在修补环境中无法拥有的东西的同时,我将如何测试这样的初始化函数?提前感谢您的帮助。
解决方案
我从您的问题中了解到您想从您的文件中模拟修补 Subprocess.Popen() 调用。为此,您应该使用以下方法:-
让我们假设您的文件名是您要为其创建单元测试的场景。因此:- 在 unittest 文件中,您应该写:-
import library
@mock.patch("library.subprocess")
def test_subprocess_call(mock_subprocess):
mock_subprocess.Popen.return_value = None
我希望你能找到你的答案。
推荐阅读
- php - 我在 php 中的查询工作得非常好,但它没有填充我的数据库
- python - Bottle 中的基本身份验证和向用户浏览器发送文件
- javascript - 如何使用 Google Cloud Storage JSON API 获取可恢复上传的上传进度信息?
- php - symfony4 : csrf 令牌无效。请尝试重新提交表单
- javascript - 警告 避免嵌套承诺 promise/no-nesting
- php - 在 IIS 上运行 PHP 时会转换哪些字符?
- c++ - 字符串文字的奇怪地址
- angular - 当 URL 从 /detail/2 更改为 /detail/3 时,如何使用 Angular 5 中的 RouteReuseStartegy API 重新初始化组件?
- entity-framework - EF6 使用现有 Db 列作为鉴别器
- bash - Sed:删除所有出现的模式后的行