我正在尝试完成我正在编写的errbot插件的单元测试。谁能告诉我如何模拟botcmd
方法使用的辅助方法?
示例:
class ChatBot(BotPlugin):
@classmethod
def mycommandhelper(cls):
return 'This is my awesome commandz'
@botcmd
def mycommand(self, message, args):
return self.mycommandhelper()
如何在执行my命令类时模拟mycommandhelper类?在我的例子中,这个类正在执行一些远程操作,这些操作在单元测试期间不应该执行。
答案 0 :(得分:0)
一种非常简单/粗略的方式是简单地重新定义执行远程操作的函数。 例如:
def new_command_helper(cls):
return 'Mocked!'
def test(self):
ch_bot = ChatBot()
ch_bot.mycommandhelper = new_command_helper
# Add your test logic
如果您希望在所有测试中都使用此方法,只需在setUp
unittest方法中执行此操作。
def new_command_helper(cls):
return 'Mocked!'
class Tests(unittest.TestCase):
def setUp(self):
ChatBot.mycommandhelper = new_command_helper
答案 1 :(得分:0)
经过大量摆弄后,以下似乎有效:
class TestChatBot(object):
extra_plugin_dir = '.'
def test_command(self, testbot):
def othermethod():
return 'O no'
plugin = testbot.bot.plugin_manager.get_plugin_obj_by_name('chatbot')
with mock.patch.object(plugin, 'mycommandhelper') as mock_cmdhelper:
mock_cmdhelper.return_value = othermethod()
testbot.push_message('!mycommand')
assert 'O no' in testbot.pop_message()
虽然我相信使用补丁修饰器会更干净。