如何从打印消息并关闭程序的函数创建单元测试?

时间:2018-01-24 01:48:46

标签: python unit-testing python-unittest

我有以下函数打印错误消息并关闭程序:

def show_error_message(error_message):
    print(error_message)
    sys.exit()  # Close Program

现在我创建了unittest并找到this topic来测试sys.exit(),但它不起作用。我想它是因为它在关闭消息之前打印。

我该如何测试?我可以在项目中随时使用Python标准库中的某些东西来执行与此函数相同的操作吗?

我试图测试的是这样的:

    def test_function_runs(self):
        """Basic smoke test: does the function run."""
        with self.assertRaises(SystemExit) as cm:
            show_error_message('message')
        self.assertEqual(cm.exception.code, 1)

我得到的错误是:

Traceback (most recent call last):
File ".test_dynamic_message.py", line 14, in test_function_runs
self.assertEqual(cm.exception.code, 1)
AssertionError: None != 1

我还是陌生人,所以我希望有人可以帮助我 谢谢

3 个答案:

答案 0 :(得分:2)

来自the python docs

  

如果值是整数,则指定系统退出状态(已通过)   到C的exit()函数);如果为None,则退出状态为零;如果它   有另一种类型(如字符串),打印对象的值   退出状态是一个。

您正在测试的功能以默认退出代码0退出。
您的测试假设异常中的退出代码为1,当您根据文档预期它为None时。

答案 1 :(得分:2)

在这种情况下,它的代码是错误的。 您的测试是正确的,无需更改

成功退出的内容(返回代码0):

def show_error_message(error_message):
    print(error_message)
    sys.exit()  # Close Program

要将错误消息打印到stderr并退出并失败(返回代码1),您需要这样:

def show_error_message_and_quit(error_message):
    sys.exit(error_message)

答案 2 :(得分:1)

异常的属性可以是代码,消息,参数等。

class TestExit(unittest.TestCase):

    def test_sys_exit_exception(self):
        with self.assertRaises(SystemExit) as e:
            sys.exit('exit_with_err')
        self.assertTrue(isinstance(e.exception, SystemExit))
        self.assertEqual(e.exception.code, 'exit_with_err')
        self.assertEqual(e.exception.message, 'exit_with_err')
        self.assertEqual(e.exception.args, ('exit_with_err',))


    def test_show_error_msg_exception(self):
        # Test the exception type
        with self.assertRaises(SystemExit) as e:
            show_error_message('test but not mock exit')
        self.assertTrue(isinstance(e.exception, SystemExit))