您可以mock
input
或将输入流传递给 cmd 以注入用户输入,但我发现通过onecmd()
Cmd
API 方法对其进行更简单灵活的测试并相信如何Cmd
读取输入。这样你就不用关心Cmd
用户命令如何直接进行肮脏的工作和测试:我cmd
同时使用控制台和套接字,这我不在乎流来自哪里。
此外,我使用onecmd()
甚至do_*
(偶尔help_*
)测试方法并使我的测试与代码的耦合更少。
按照我如何使用它的简单示例。create()
并且_last_write()
是构建MyCLI
实例并分别获取最后输出行的辅助方法。
from mymodule import MyCLI
from unittest.mock import create_autospec
class TestMyCLI(unittest.TestCase):
def setUp(self):
self.mock_stdin = create_autospec(sys.stdin)
self.mock_stdout = create_autospec(sys.stdout)
def create(self, server=None):
return MyCLI(stdin=self.mock_stdin, stdout=self.mock_stdout)
def _last_write(self, nr=None):
""":return: last `n` output lines"""
if nr is None:
return self.mock_stdout.write.call_args[0][0]
return "".join(map(lambda c: c[0][0], self.mock_stdout.write.call_args_list[-nr:]))
def test_active(self):
"""Tesing `active` command"""
cli = self.create()
self.assertFalse(cli.onecmd("active"))
self.assertTrue(self.mock_stdout.flush.called)
self.assertEqual("Autogain active=False\n", self._last_write())
self.mock_stdout.reset_mock()
self.assertFalse(cli.onecmd("active TRue"))
self.assertTrue(self.mock_stdout.flush.called)
self.assertEqual("Autogain active=True\n", self._last_write())
self.assertFalse(cli.onecmd("active 0"))
self.assertTrue(self.mock_stdout.flush.called)
self.assertEqual("Autogain active=False\n", self._last_write())
def test_exit(self):
"""exit command"""
cli = self.create()
self.assertTrue(cli.onecmd("exit"))
self.assertEqual("Goodbay\n", self._last_write())
如果您的 cli 应该终止,请注意onecmd()
返回,否则。True
False