我正在使用浮动(Self),它应该从yt获得可下载的文件大小。
使用subprocess.check_output()来调用yt。我想嘲弄它,但却找不到办法。
请帮帮忙。
尝试过的方法:
How can I mock subprocess.check\_output?
第一个根本不起作用。它总是写着0.0。第二种方法是回溯(属性错误):
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
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.lengthUTEST
调用float(self)
的类
@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任何投入都是非常感谢的。
发布于 2022-09-19 11:03:39
我建议您避免使用模拟,并使用类的另一种方法来计算bytesize。在测试中,使用该类的子类并重写此函数。
例如:
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)在你的测试中
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这对你来说会是一种不成功的方法吗?
https://stackoverflow.com/questions/73770332
复制相似问题