首页 > 解决方案 > 在 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)但我似乎无法让它发挥作用。在修补环境中无法拥有的东西的同时,我将如何测试这样的初始化函数?提前感谢您的帮助。

标签: pythonpython-2.7pytest

解决方案


我从您的问题中了解到您想从您的文件中模拟修补 Subprocess.Popen() 调用。为此,您应该使用以下方法:-

让我们假设您的文件名是您要为其创建单元测试的场景。因此:- 在 unittest 文件中,您应该写:-

import library

@mock.patch("library.subprocess")
def test_subprocess_call(mock_subprocess):
    mock_subprocess.Popen.return_value = None

我希望你能找到你的答案。


推荐阅读