我不确定我做错了什么。也许我有一个错误的结束与嘲笑。但我的假设是,当你使用模拟时,它基本上会做一些魔法并替换原始代码中的对象。
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中)与第一个打印输出相同,并循环遍历我作为返回值传递的列表。
非常感谢任何帮助。
更新 要说明我最初是如何导入我的课程的
答案 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的回答一起帮助我实现了它的工作