在测试
如果我运行上面的代码,会得到预期的
但是如果我尝试模拟
/foo/test_response
create_response
方法时,我似乎无法模拟 get_external_response
方法的返回值。
< p >/foo/response
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
,因为我已经模拟了它。
有人能解释一下我做错了什么吗?