2017-01-25 16 views
0

私が書いているerrbotプラグインのユニットテストを完了しようとしています。どのようにbotcmdメソッドで使用されるヘルパーメソッドを模倣する方法を教えてもらえますか?errbotのヘルパーメソッドを模擬する方法

例:

class ChatBot(BotPlugin): 

    @classmethod 
    def mycommandhelper(cls): 
     return 'This is my awesome commandz' 

    @botcmd 
    def mycommand(self, message, args): 
     return self.mycommandhelper() 

私のコマンドクラスを実行するとき、どのように私はmycommandhelperクラスをモックすることができますか?私の場合、このクラスはユニットテスト中に実行すべきではないリモート操作を実行しています。

答えて

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 
+0

これは通常のユニットテストではうまくいくと思いますが、testbot.push_messageやtestbot.pop_messageなどの機能を提供するerrbotのtestbot実装でうまくいくかどうかわかりません。 Testbotは模擬クラスをインポートするのではなく、プラグインの元のクラスとメソッドをインポートします。 – DidiV

+0

あなたが私たちに与えた制限されたコンテキスト/コードでは、それ以上のことは言えません。 クラスをインポートし、その変数を直接変更して模擬し、TestBotをインポートすると、*変更された元のクラスがインポートされます。 – Nether

+0

十分なことですが、この特定のフレームワーク(errbot)はプラグインを動的に読み込むtestbotオブジェクトを提供しています。この目的のために、extra_plugin_dir = '。'を使用します。あなたは私の例で見ることができます。したがって、フレームワークは変更されていない元のafaikをロードするため、テストファイル内のプラグインクラスを変更することはできません。私はあなたがこれを助け、努力していることに感謝します。 – DidiV

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

私はパッチデコレータを使用すると、きれいになると信じていますが。