没有看到实际的代码是很难猜测,但是我会作出一些假设:
- 逻辑在静态方法是确定性的。
- 在对输入值进行了一些计算之后,结果为 ,并且使用此结果完成了一些操作。
- python3.4(模拟已经演变和移动在过去的几个版本)
为了测试代码,一个必须检查并确保至少它到底会产生预期的结果。如果没有返回值,那么通常会将结果存储或发送到某个地方。在这种情况下,我们可以检查存储或发送结果的方法是否以期望的参数调用。
这可以使用mock
包中的工具完成,该工具包已成为unittest
包的一部分。
例如在my_package/my_module.py
以下静态方法:
import uuid
class MyClass:
@staticmethod
def my_procedure(value):
if isinstance(value, str):
prefix = 'string'
else:
prefix = 'other'
with open('/tmp/%s_%s' % (prefix, uuid.uuid4()), 'w') as f:
f.write(value)
在单元测试中,我将检查以下内容:
open
被调用。
- 预期的文件名已被计算。
open
已在write
模式下调用。
- 文件句柄的
write()
方法已用所期望的参数调用。
单元测试:
import unittest
from unittest.mock import patch
from my_package.my_module import MyClass
class MyClassTest(unittest.TestCase):
@patch('my_package.my_module.open', create=True)
def test_my_procedure(self, open_mock):
write_mock = open_mock.return_value.write
MyClass.my_procedure('test')
self.assertTrue(open_mock.call_count, 1)
file_name, mode = open_mock.call_args[0]
self.assertTrue(file_name.startswith('/tmp/string_'))
self.assertEqual(mode, 'w')
self.assertTrue(write_mock.called_once_with('test'))
只是调用函数,没有任何断言。如果它发生异常,测试将失败。 – zvone
所以如果程序_doesn't_引发异常,它成功了吗?然后调用过程_without_ try/catch包装器。 –
是;如果程序不*引发异常,则成功。如果引发异常,则被其他使用该过程的类捕获。因此,如果发生不良情况,将会在unittest方法中抛出任何异常。 – daniel451