在看Python裡自帶的一個單元測試庫unittest,有個有意思的應用是可以對類似于print()這樣無return傳回值的函數做驗證。見下面代碼。
#!/usr/bin/env python3
from unittest import TestCase
from unittest.mock import patch
from unittest import main
class Person(object):
def __init__(self, name):
self.name = name
def print_name(self):
print('My name is ' + self.name)
class FuncTest(TestCase):
def test_print_name01(self):
john = Person('John')
with patch('builtins.print') as mocked_print:
john.print_name()
mocked_print.assert_called_with('My name is John')
def test_print_name02(self):
john = Person('Donald')
with patch('builtins.print') as mocked_print:
john.print_name()
mocked_print.assert_called_with('My name is Donald')
if __name__ == '__main__':
main()
執行結果
reedx:garrulous_py_practice reed$ python3 py_unittest_01.py..
Ran 2 tests in 0.001s
OK
其中的
with patch('builtins.print') as mocked_print:
語句是在with的block裡,将内置函數print替換為mocked_print函數,再去block裡執行print,實際也就是在執行mocked_print函數,然後去檢查mocked_print函數是否收到同樣的傳入參數,也即檢查了print語句的輸出(print語句自然是傳入什麼樣的字元串,就輸出列印出什麼樣的字元串)。
顯而易見,這就是去驗證目标函數或者方法的傳入參數,單元測試裡可以應用的範圍很廣。