2014-08-31 38 views
0

我正在編寫一個tkinter小部件的單元測試,它是大型應用程序的一部分。 我有一些與標籤上的事件觸發相關的問題,以斷言回調執行。Tkinter事件的測試問題

請注意,當檢查按鈕的回調時,我的測試代碼運行良好。在這種情況下,我寫了類似的東西:

a_button = self.sc._inner_frame.winfo_children()[2].winfo_children()[2] 
    a_button.invoke() 
    self.assertTrue(self.controller.add_sell_indicator.called) 

它的工作原理。

對於標籤,但是,沒有一個invoke()方法,所以我用event_generate()按:

label = self.sc._inner_frame.winfo_children()[0].winfo_children()[0] 
    label.event_generate("<Button-1>") 
    self.assertTrue(self.controller.get_selected_indicator.called) 

但由於事件<Button-1>不會觸發測試失敗。

我在label.event_generate之前和之後玩了一下或者ipdb.set_trace()。我注意到,只有當我把它放在呼叫之前,然後按c繼續執行,而不在解釋器外殼中觸發任何其他命令,測試不會失敗。

任何提示或解決方法?

回答

0

您可能需要使用warp選項才能使鼠標懸停在小部件上。如果光標不在窗口小部件上,很可能小部件會檢查忽略按鈕事件。在點擊之前,您可能能夠避免產生<Enter>事件。

我記得我在tcl/tk編寫測試軟件時不得不做這些技巧,但我從來沒有用Tkinter做過。我甚至不知道在Tkinter中是否支持warp選項。您可能必須圍繞核心tcl/tk事件生成命令編寫自己的包裝。

+0

thx建議。扭曲選項存在,但並沒有做到這一點。此外,當我放置一個set_trace時,我實際上並沒有向'label.event_generate(「」)'添加任何東西,但事件沒有被觸發。 – andtorg 2014-08-31 17:10:31

+0

當調試器暫停執行時,是否要移動鼠標以便與調試器交互? – 2014-08-31 17:12:31

+0

它不影響結果。我點擊shell窗口或按Alt + Tab,當我恢復執行測試通過 – andtorg 2014-08-31 17:48:00