2016-10-14 9 views
0
from checker.checker import check_board_state, check_row, check_winner,\ 
    check_column, check_diagonal 

import sys 
import unittest 


class TestChecker(unittest.TestCase): 

    def test_winner_row(self): 
     check_board_state([['o', 'x', '.'], 
          ['o', 'o', 'o'], 
          ['.', 'x', 'o']]) 

     output = sys.stdout.getvalue().strip() 
     assert output == 'o' 

    def test_draw(self): 
     check_board_state([['.', 'x', '.', 'o', 'o'], 
          ['o', 'o', 'x', '.', '.'], 
          ['.', 'o', 'x', '.', '.'], 
          ['.', 'o', 'x', '.', '.'], 
          ['.', 'o', 'x', '.', '.']]) 

     output = sys.stdout.getvalue().strip() 
     assert output == '.' 


if __name__ == '__main__': 
    unittest.main() 

check_board_state関数で印刷された値をテストしたいのですが、これらのテストに問題があります。私が代わりにPythonの実行のunittestモジュールはPythonを使用する場合Python 3.5 unittestで印刷された値をテストするには?

AttributeError: '_io.TextIOWrapper' object has no attribute 'getvalue'

テストはEclipseでPyDevはで正常に動作します:私は

python -m unittest tests.py

私が持っているエラーを使用してそれらを実行しようとします。どうすればこの問題を解決できますか?

+0

あなたはそれではなく、標準出力にそれを印刷したものを返すようcheck_board_stateを変更したり、デフォルトはあなたが一種の[印刷](HTTPSのように、あなたのテストから渡すことができることをsys.stdoutにパラメータを追加することができます。 python3の関数 – solarc

+0

'stdout'をテストできるバッファにリダイレクトする必要があります。 [これを見る](http://stackoverflow.com/questions/1218933/can-i-redirect-the-stdout-in-python-into-some-sort-of-string-buffer)また、 'unittest.TestCase'にある' assert'メソッドを使うと、より豊かで読みやすくなります。 – Dan

答えて

1
from checker import checker 
from io import StringIO 
import sys 
import unittest 


class TestChecker(unittest.TestCase): 
    def setUp(self): 
     # every test instance the class(setUp) 
     self.cls = checker() 
     old_stdout = sys.stdout 
     sys.stdout = mystdout = StringIO() 
     super(TestChecker, self).setUp() 

    def test_winner_row(self): 
     # the modules should give a return 
     self.cls.check_board_state([['o', 'x', '.'], 
            ['o', 'o', 'o'], 
            ['.', 'x', 'o']]) 

     result = sys.stdout.getvalue().strip() 
     excepted = "o" 
     # use unittests assertion methods 
     self.assertEqual(excepted, result) 

    def test_draw(self): 
     self.cls.check_board_state([['.', 'x', '.', 'o', 'o'], 
            ['o', 'o', 'x', '.', '.'], 
            ['.', 'o', 'x', '.', '.'], 
            ['.', 'o', 'x', '.', '.'], 
            ['.', 'o', 'x', '.', '.']]) 
     result = sys.stdout.getvalue().strip() 
     excepted = "." 
     self.assertEqual(excepted, result) 

    def tearDown(self): 
     sys.stdout = old_stdout 
     super(TestChecker, self).tearDown() 
if __name__ == '__main__': 
    unittest.main() 
+0

あなたの答えを説明してください。 – erip

+0

きれいに実行されますが、テスト中の関数の戻り値についての前提があります。あなたがこれを正しければ、私は投票します。 – Dan

+0

@Dan true。フィードバックありがとう、私はそれを変更する –

関連する問題