# module: acc.py import codecs import configparser import os from tkinter import * from tkinter import messagebox class AccountWindow(Tk): def __init__(self): super().__init__() self.config = configparser.ConfigParser() head, _ = os.path.split(__file__) path_ = os.path.normpath(os.path.join(head, 'config.ini')) with codecs.open(path_, 'r', 'utf8') as f: self.config.read_file(f) self.title(self.config.get('GUI Account', 'title')) self.option_add('*tearOff', False) self.name = 'account window' menubar = Menu(self, name='account menubar') self['menu'] = menubar menu_help = Menu(menubar, name='help menu') menu_help.add_command( label=self.config.get('GUI Account', 'help help'), command=self.help_) menu_help.add_command( label=self.config.get('GUI Account', 'help about'), command=self.about) menubar.add_cascade( menu=menu_help, label=self.config.get('GUI Account', 'menu help')) def help_(self): title = self.config.get('GUI Help', 'title') message = self.config.get('GUI Help', 'message') messagebox.showinfo(title, message, icon='question', parent=self) def about(self): title = self.config.get('GUI About', 'title') message = self.config.get('GUI About', 'message') messagebox.showinfo(title, message, parent=self) def main(): app = AccountWindow() app.mainloop() if __name__ == '__main__': sys.exit(main()) ###################################################################### # -*- coding: utf-8 -*- # file: config.ini [GUI Account] title = Accounts menu help = Help help help = View Help help about = About Accounts [GUI About] title = About message = About text [GUI Help] title = Help message = Help text ###################################################################### # -*- coding: utf-8 -*- # test_acc.py import unittest import unittest.mock import acc class TestAccountWindow(unittest.TestCase): HELP_HELP = 'Help help' HELP_ABOUT = 'Help about' def setUp(self): self.config = ['', # __init__() config calls, Window title. self.HELP_HELP, # Help menu item self.HELP_ABOUT, # About menu item ''] # Help menu def test_menu_help_item_help(self): self.messagebox_helper(self.HELP_HELP, icon='question') def test_menu_help_item_about(self): self.messagebox_helper(self.HELP_ABOUT) @unittest.mock.patch('acc.configparser.ConfigParser.get', autospec=True) @unittest.mock.patch('acc.messagebox.showinfo', autospec=True) def messagebox_helper( self, menu_item, mock_messagebox, mock_get_value, **kwargs): self.config += ['title', # app.messagebox config calls 'message'] mock_get_value.side_effect = self.config self.app = acc.AccountWindow() self.app.children['account menubar'].children['help menu'].invoke( menu_item) mock_messagebox.assert_called_with(self.config[-2], self.config[-1], parent=self.app, **kwargs)