2017-02-17 3 views
0

私が書いたTkinterアプリケーションのunittests(それらについて学んでいる間)を実装しようとしています。その目的のために(masterとしてそれをTkinterのインスタンスを渡す)は、以下に示すように、私は自分のアプリケーションの基本的な構造の周りに非常に最小限のユニットテストを作成するために管理している:tkinterアプリケーションのユニットテスト

classTest.py

#! /usr/bin/env python 
from Tkinter import * 

class App(): 
    def __init__(self,master): 
     self.text = "foo" 
     self.printy() 

    def printy(self): 
     print self.text 
     return "test" 

# Call the main app 
if __name__ == "__main__": 
    root = Tk() 
    app = App(root) 
    root.mainloop() 

test.py

#! /usr/bin/env python 
from Tkinter import * 
import unittest 
import classTest 

class testTest(unittest.TestCase): 
    def test(self): 
     a = classTest.App(Tk()) 
     self.assertEqual(a.printy(),"test") 

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

このテストでは、正常に実行されたことが表示されますが、fooが2回印刷されます。しかし、私がアプリケーション全体で同じコンセプトを実行しようとすると、私のクラスの__init__でクラッシュします。

unitTest.py

#! /usr/bin/env python 
import unittest 
from Tkinter import * 
import MassyTools 

class readTest(unittest.TestCase): 
    def test(self): 
     a = MassyTools.App(Tk()) 
     self.assertEqual(a.readData("./tests/calibrated_IBD cohort sample H6-run 1_0_E24_1.xy")[0][0],1299.11) 

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

このテストを実行すると、ルートが定義されていないという事実にそれをクラッシュ(エラー下記参照)。

enter image description here

私はこのblogpostごとにあざけるの周りいじるされていますが、私は本当にまだ概念を把握していません。私は、ユニットテストでは異なって、それをインスタンス化し、この中で呼び出された場合、偽のルートを持っているようにアプリケーションを変更する必要がある場合

class App(): 

    def __init__(self, master): 
     # The Canvas 
     self.canvas = FigureCanvasTkAgg(self.fig, master=master) 
     self.toolbar = NavigationToolbar2TkAgg(self.canvas, root) 
     self.canvas.get_tk_widget().pack(fill=BOTH, expand=YES) 
     self.canvas.draw() 

したがって、質問は次のとおりです。以下は、問題self.toolbarラインを含むMassyTools.pyファイルのサブセットです道や他の何かを完全に。

+0

は、我々はコンパイラエラーを参照してくださいもらえますか? –

+0

私はそれが多くの情報を追加するとは思わないが、私は今それを追加しました。 –

答えて

0

私がテストしたいアプリケーションの問題を発見したので、私はroot = Tk()をメインに宣言しました。このrootは、Appクラスにmasterとして渡されましたが、プログラムではrootを呼び出しました。masterになっているはずです。以下の変更は、最初のクラッシュを取り除く、私はatexitへの呼び出しを物理的に(this答えとして)アプリケーションを閉じる必要はありませんが含まれています。

改訂アプリケーション:

class App(): 

    def __init__(self, master): 

     # The Canvas 
     self.canvas = FigureCanvasTkAgg(self.fig, master=master) 
     self.toolbar = NavigationToolbar2TkAgg(self.canvas, master) 
     self.canvas.get_tk_widget().pack(fill=BOTH, expand=YES) 
     self.canvas.draw() 

# Call the main app 
if __name__ == "__main__": 
    root = Tk() 
    app = App(root) 
    root.mainloop() 

次のように私は私が物理的にアプリケーションを閉じた後、今OKで終了している、私のunittest.pyコードを調整する:

#! /usr/bin/env python 
import unittest 
from Tkinter import * 
import MassyTools 
import atexit 

class readTest(unittest.TestCase): 
    def test(self): 
     self.assertEqual(a.readData("./tests/calibrated_IBD cohort sample H6-run 1_0_E24_1.xy")[0][0],1299.11) 

if __name__ == "__main__": 
    # Set up Tk(), instantiate the application and close it right away. 
    root = Tk() 
    a = MassyTools.App(root) 
    atexit.register(root.mainloop) 
    root.destroy() 

    # Start the actual tests 
    unittest.main(verbosity=2) 
関連する問題