[Python][mock][HowTo] 檢查 STDOUT 的輸出

如果某個 function/method 的責任是在 STDOUT 印出一些資訊(例如 xml.etree.ElementTree.dump()),要如何檢查輸出的資訊是正確的?

基本上,只要事先用 StringIO 將 STDOUT (sys.stdout) 置換掉,之後就可以透過 StringIO.getvalue() 檢查實際輸出的內容。例如:

from StringIO import StringIO
import unittest2 as unittest
from mock import patch

def say_hello(who=None):
    who = who or 'World'
    print 'Hello, %s!' % who

class Test(unittest.TestCase):

    @patch('sys.stdout', new_callable=StringIO)
    def test_hello_default(self, mock_stdout):
        say_hello()
        self.assertEqual(mock_stdout.getvalue(), 'Hello, World!\n')

    @patch('sys.stdout', new_callable=StringIO)
    def test_hello_someone(self, mock_stdout):
        say_hello('Success')
        self.assertEqual(mock_stdout.getvalue(), 'Hello, Success!\n')

參考資料

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s