python-3.x - 模拟方法的返回值不起作用
问题描述
在测试该create_response
方法时,我似乎无法模拟该get_external_response
方法的返回值。
/foo/响应
from abc import ABCMeta, abstractmethod
def create_response(url, type):
query = create_query(url, type)
external_response = get_external_response(query) <-- what I want to mock
return external_response
def create_query(url, type):
cc = MyFactory
return cc.get_concrete_class(url, type)
def get_external_response(cc):
return cc.make_query()
class MyAbstractClass(metaclass=ABCMeta):
def __init__(self, url, type):
self.url = url
self.type = type
self.query = self.make_query()
@abstractmethod
def make_query(self):
pass
class MyFactory:
@staticmethod
def get_concrete_class(url, type):
if type == 'A':
return MyClass(url, type)
else:
print("not valid type")
class MyClass(MyAbstractClass):
def __init__(self, url, type):
super().__init__(url, type)
def make_query(self):
return self.url + self.type
if __name__ == '__main__':
result = create_response('www.stackoverflow.com', 'A')
print(result)
如果我运行上述内容,我会得到预期的www.stackoverflow.comA
.
但是,如果尝试模拟 的返回值get_external_response
,它似乎没有做任何事情:它仍然返回www.stackoverflow.comA
并且下面的断言失败。
/foo/test_response
from foo.response import create_response
import pytest
from unittest import mock
def test_create_response():
mock_external_response = mock.Mock()
mock_external_response.create_flask_response.return_value = 'www'
result = create_response('www.stackoverflow.com', 'A')
assert result == 'www'
我不明白为什么没有设置返回值,因为当create_response
被调用时,它最终会到达调用的点create_flask_response
,如果我没记错的话,应该返回www
,因为我已经模拟了它。
有人可以解释我做错了什么吗?
解决方案
我注意到您在函数内部创建了一个 Mock 对象,但实际上并没有使用 Mock。看起来您需要修补用于使用 Mock 的功能。
/foo/test_response
@mock.patch('foo.response.get_external_response')
def test_create_response(mock_get_external_reponse):
mock_get_external_response.return_value = 'www' # This is a Mock object, but will be used as a patch over the actual function where it is used
result = create_response('www.stackoverflow.com', 'A')
assert result == 'www'
为方便起见,快速链接到相关文档部分:
模拟和修补简介: https ://docs.python.org/3/library/unittest.mock.html#quick-guide
专门在这里打补丁: https ://docs.python.org/3/library/unittest.mock.html#unittest.mock.patch
推荐阅读
- asp.net - Blazor (.Net core 3.1) 部分类是否等同于`@inject ViewModel`?
- python - 当 Flask 应用程序服务器与应用程序所需的其他文件一起放置在文件夹中时,出现“未找到服务器上未找到请求的 URL”
- python-3.x - 在 CentOS6 中运行 python 子进程和 Libreoffice 6.2 时无法打开显示错误
- html - Open local files and web files in HTML
- c# - Is there any way to use authentication service without azure bot service?
- ios - audioPlayerDidFinishPlaying usage
- .net-core - MSBuild 如何检测 .NET Core 的版本?
- php - Merging couple different arrays with same keys into one array
- hosting - 当我将我的 dns 记录指向 cloudflare 时,我当前的主机是否停止工作?我必须重新托管我的网站 incloudflare 吗?
- c++ - multiply & divide operation in openCV