我正在尝试为我编写的Tkinter应用程序实现单元测试(同时了解它们)。为此,我设法围绕我的应用程序的基本结构创建了一个非常简单的单元测试,如下所示(将Tkinter实例作为master
传递给它):
在类测试.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()
在测试.py在
^{pr2}$这个测试返回它运行成功,尽管它确实打印了foo
两次。但是,当我试图在整个应用程序上运行相同的概念时,它会在类的__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()
运行此测试会因为根未定义而崩溃(请参阅下面的错误)。在
我一直在根据这个blogpost进行嘲弄,但我还没有真正掌握这个概念。下面是MassyTools.py包含有问题的self.toolbar
行的文件:
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()
因此,问题是,如果我应该在unittest中以不同的方式实例化它,那么修改应用程序,使其具有一个伪根(如果以这种方式调用的话)或者完全是其他方法。在
我在要测试的应用程序中发现了问题,我在main中声明了
root = Tk()
。这个root
被作为App
传递给master
类,但在程序中,我调用了root
,它应该在master
的地方。下面的更改消除了最初的崩溃,我还包括了对atexit
的调用,以不必物理地关闭应用程序(根据this答案)。在修订申请:
我调整了我的unittest.py代码如下所示,在我实际关闭应用程序后,现在以OK结束:
^{pr2}$相关问题 更多 >
编程相关推荐