用模拟替换对象

时间:2016-11-10 13:02:02

标签: python unit-testing python-3.x mocking

我不确定我做错了什么。也许我有一个错误的结束与嘲笑。但我的假设是,当你使用模拟时,它基本上会做一些魔法并替换原始代码中的对象。

sites.py

class Sites:
    def __init__(self):
        pass

    def get_sites(self):
        return ['washington', 'new york']

my_module.py

from mylib import sites

def get_messages():
    # get Sites
    sm = sites.Sites()
    sites = sm.get_sites()
    print('Sites:' , sites)

    for site in sites:
        print('Test: ' , site)

my_test.py

import my_module
import unittest
from unittest.mock import patch


class MyModuleTestCase(unittest.TestCase):

    @patch('my_module.Sites')
    def test_process_the_queue(self, mock_sites):
        mock_sites.get_sites.return_value = ['london', 'york']

        print(mock_sites.get_sites())
        my_module.get_messages()

if __name__ == '__main__':
    unittest.main()

运行这个我得到以下输出:

.['london', 'york']
Sites: <MagicMock name='Sites().get_sites()' id='139788231189504'>

----------------------------------------------------------------------
Ran 1 test in 0.002s

OK
[Finished in 0.1s]

我期待第二个打印输出(发生在my_module.py中)与第一个打印输出相同,并循环遍历我作为返回值传递的列表。

非常感谢任何帮助。

更新 要说明我最初是如何导入我的课程的

2 个答案:

答案 0 :(得分:1)

Python模拟,虽然愚蠢强大,但使用起来肯定不是很直观。

print语句显示您正在正确修补my_module.Sites,但您没有正确注册get_sites返回值,它应该是:

mock_sites.return_value.get_sites.return_value = ['london', 'york']

print语句显示在修补对象上注册了Sites().get_sites()

Sites: <MagicMock name='Sites().get_sites()' id='139788231189504'>

阅读本文时,我发现将()翻译为return_value

会很有帮助

Sites.return_value.get_sites.return_value

您缺少的返回值表示模拟网站对象的实例化:Sites()

答案 1 :(得分:0)

我遇到的问题是我导入和调用外部类的方式。

from mylib import sites
sm = sites.Sites()

使用时,模拟会更快乐:

from mylib.sites import Sites
sm = Sites()

这与dm03514的回答一起帮助我实现了它的工作