如何在python中模拟全局对象的方法?

时间:2018-03-24 10:03:03

标签: python unit-testing mocking global-variables

我有一个文件说twitter.py,其中我有两个全局对象:user和tweet。 我有另一个文件说twitter_utils.py,其中我导入了模块twitter,并编写了几个使用全局对象的方法如下:

twitter_utils.py:

import twitter

def __get_user_date_of_birth(user_id):
    return twitter.user.get_date_of_birth(userId=user_id)

def __get_tweet_likes_count(user_id, tweet_id):
    return twitter.tweet.getLikesCount(user_id, tweet_id)

我创建了一个文件test_twitter_utils.py并尝试编写上述方法的测试。以下是一次尝试:

import twitter
import twitter_utils

@patch('twitter_utils.twitter.user')
def test_get_user_date_of_birth(mock_user):
    mock_get_date_of_birth = Mock(
            return_value='18 Aug 1989')
    mock_user.attach_mock(mock_get_date_of_birth,
                                          'get_date_of_birth')
    twitter_utils.__get_user_date_of_birth('test')
    assert mock_user.mock_get_date_of_birth.call_count == 1

上面的测试失败并出现断言错误,断言0 == 1。 基本上说mock_user.mock_get_date_of_birth.call_count = 0.我做错了什么?我是以错误的方式进口东西吗?

1 个答案:

答案 0 :(得分:0)

我相信您需要使用模块导入的路径进行模拟。 twitter_utils.py导入twitter,因此您的patch应修补twitter

@patch('twitter_utils.twitter')

然后你可以从那里模拟函数。

你做过导演,如:

from twitter import user as twitter_user

然后你的补丁将是@patch("twitter_utils.twitter_user")

另外,不确定您是否知道,但在编写测试时,使用unittest框架是件好事。 https://docs.python.org/2/library/unittest.html