首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确地模拟subprocess.check_output()?

如何正确地模拟subprocess.check_output()?
EN

Stack Overflow用户
提问于 2022-09-19 08:12:03
回答 1查看 66关注 0票数 0

我正在使用浮动(Self),它应该从yt获得可下载的文件大小。

使用subprocess.check_output()来调用yt。我想嘲弄它,但却找不到办法。

请帮帮忙。

尝试过的方法:

How can I mock subprocess.check\_output?

  • (just
  • (模拟check_output直接)由check_output调用的
    • )

第一个根本不起作用。它总是写着0.0。第二种方法是回溯(属性错误):

代码语言:javascript
复制
    Error
Traceback (most recent call last):
  File "/usr/lib/python3.10/unittest/mock.py", line 1369, in patched
    return func(*newargs, **newkeywargs)
  File "/home/elphael/PycharmProjects/hoarder/core/test_file.py", line 61, in test__float__handlesSpecialCode
    self.assertAlmostEqual(15.83, float(obj))  # verify it returns value
  File "/home/elphael/PycharmProjects/hoarder/core/file.py", line 40, in __float__
    bytesize = subprocess.check_output(f"yt-dlp -O filesize_approx {self.url}".split(),
  File "/usr/lib/python3.10/subprocess.py", line 420, in check_output
    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
  File "/usr/lib/python3.10/subprocess.py", line 501, in run
    with Popen(*popenargs, **kwargs) as process:
AttributeError: __enter__

我曾试图嘲弄__enter __,但没有成功。

函数

yt-dlp

  • convert

  • 获取self.url并将字节轮询到Mb (auxillary.bytesto())
  1. assign结果到self.length并返回

代码语言:javascript
复制
    def __float__(self):

        try:
            bytesize = subprocess.check_output(f"yt-dlp -O filesize_approx {self.url}".split(),
                                               stderr=subprocess.STDOUT)
            megabytes = auxillary.bytesto(bytesize, 'm')  # I only need approx size
            self.length = round(megabytes, 2)
        except subprocess.CalledProcessError:
            return -2.0
        return self.length

UTEST

调用float(self)

  • verify self.length =预期的

的类

代码语言:javascript
复制
@patch("subprocess.Popen")
    def test__float__handlesSpecialCode(self, mock_subproc_popen):
        """
            -1.0 length is meant to show that length is yet to be calculated
        """
        process_mock = Mock()
        attrs = {"communicate.return_value": ("output", "error")}
        process_mock.configure_mock(**attrs)
        mock_subproc_popen.return_value = process_mock
        obj = TFile("https://www.youtube.com/watch?v=GtL1huin9EE", -1.0)
        self.assertAlmostEqual(15.83, float(obj))  # verify it returns value
        self.assertNotEqual(-1, obj.length)  # verify self.length preserves that value

任何投入都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-19 11:03:39

我建议您避免使用模拟,并使用类的另一种方法来计算bytesize。在测试中,使用该类的子类并重写此函数。

例如:

代码语言:javascript
复制
   def __float__(self):

        try:
            bytesize = self.calculate_bytesize()
            megabytes = auxillary.bytesto(bytesize, 'm')  # I only need approx size
            self.length = round(megabytes, 2)
        except subprocess.CalledProcessError:
            return -2.0
        return self.length

    def calculate_bytesize():
        return subprocess.check_output(f"yt-dlp -O filesize_approx {self.url}".split(), stderr=subprocess.STDOUT)

在你的测试中

代码语言:javascript
复制
def test__float__handlesSpecialCode(self, mock_subproc_popen):
    """
        -1.0 length is meant to show that length is yet to be calculated
    """
    obj = DummyTFile("https://www.youtube.com/watch?v=GtL1huin9EE", -1.0)
    obj.mock_bytesize = ("output", "error")

    self.assertAlmostEqual(15.83, float(obj))  # verify it returns value
    self.assertNotEqual(-1, obj.length)

class DummyTFile(TFile):
    def __init__(self, *args):
        super().__init__(*args)
        self.mock_bytesize = None

    def calculate_bytesize():
        return self.mock_bytesize

这对你来说会是一种不成功的方法吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73770332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档