如何模拟errbot的帮助方法

时间:2017-01-25 10:20:24

标签: python errbot

我正在尝试完成我正在编写的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类?在我的例子中,这个类正在执行一些远程操作,这些操作在单元测试期间不应该执行。

2 个答案:

答案 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()

虽然我相信使用补丁修饰器会更干净。