python mock patch:调用实例的方法?

时间:2014-08-25 04:18:09

标签: unit-testing python-2.7 mocking python-mock

在python 2.7中,我有这个功能

from slacker import Slacker


def post_message(token, channel, message):
    channel = '#{}'.format(channel)

    slack = Slacker(token)
    slack.chat.post_message(channel, message)

使用mock和patch,我可以检查该令牌是否在Slacker类中使用

import unittest
from mock import patch

from slacker_cli import post_message


class TestMessage(unittest.TestCase):

    @patch('slacker_cli.Slacker')
    def test_post_message_use_token(self, mock_slacker):
        token = 'aaa'
        channel = 'channel_name'
        message = 'message string'

        post_message(token, channel, message)

        mock_slacker.assert_called_with(token)

如何检查post_message中的字符串使用情况?

我尝试

mock_slacker.chat.post_message.assert_called_with('#channel_name') 

但我得到

AssertionError: Expected call: post_message('#channel_name')
Not called

1 个答案:

答案 0 :(得分:3)

您需要具体说明通话的发生地点。代码是:

slack.chat.post_message

因此,由于slack是模拟类Slacker的一个实例,因此您需要使用return_value来确保您正在谈论该实例:< / p>

mock_slacker.return_value.chat.post_message.assert_called_with

您已对'slacker_cli.Slacker'进行了修补,因此mock_slacker是一个已修补的课程。调用本身发生在该修补类的实例上。调用类会返回一个实例,因此使用return_value