【发布时间】:2023-03-15 07:44:01
【问题描述】:
我有一个 python3.7 脚本,它以 YAML 文件作为输入,并根据其中的说明对其进行处理。我用于单元测试的 YAML 文件如下所示:
...
tasks:
- echo '1'
- echo '2'
- echo '3'
- echo '4'
- echo '5'
脚本循环执行任务,然后使用os.system() 调用运行每个任务。
手动测试表明,输出符合预期:
1
2
3
4
5
但我无法让它在我的单元测试中工作。这是我尝试捕获输出的方式:
from application import application
from io import StringIO
import unittest
from unittest.mock import patch
class TestApplication(unittest.TestCase):
def test_application_tasks(self):
expected = ['1','2','3','4','5']
with patch('sys.stdout', new=StringIO()) as fakeOutput:
application.parse_event('some event') # print() is called here within parse_event()
self.assertEqual(fakeOutput.getvalue().strip().split(), expected)
运行python3 -m unittest discover -s tests 时,我得到的只是AssertionError: Lists differ: [] != ['1', '2', '3', '4', '5']。
我也尝试改用with patch('sys.stdout', new_callable=StringIO) as fakeOutput:,但无济于事。
我尝试的另一件事是self.assertEqual(fakeOutput.getvalue(), '1\n2\n3\n4\n5'),这是 unittest 输出的内容:
AssertionError: '' != '1\n2\n3\n4\n5'
+ 1
+ 2
+ 3
+ 4
+ 5
显然,该脚本工作并输出正确的结果,但fakeOutput 没有捕获它。
使用patch 作为装饰器也不起作用:
from application import application
from io import StringIO
import unittest
from unittest.mock import patch
class TestApplication(unittest.TestCase):
@patch('sys.stdout', new_callable=StringIO)
def test_application_tasks(self):
expected = ['1','2','3','4','5']
application.parse_event('some event') # print() is called here within parse_event()
self.assertEqual(fakeOutput.getvalue().strip().split(), expected)
会输出完全相同的错误:AssertionError: Lists differ: [] != ['1', '2', '3', '4', '5']
【问题讨论】:
-
您的问题不完整。
application的定义在哪里?print("Here is some output")的简单定义不会重现您描述的行为。 -
基于
os.system的提及,虽然我会猜测...... -
@Jean-PaulCalderone 是的,我已经意识到了......让我感到困惑的是我马上开始使用
echo
标签: python-3.x stdout python-unittest