python-3.x - 模拟方法的返回值不起作用

标签 python-3.x mocking python-mock

测试时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。
看起来您需要修补用于使用 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

关于python-3.x - 模拟方法的返回值不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58894083/

相关文章:

python - pymysql 事务保存一个插入查询但忽略两个更新查询而不引发错误

我能否在调试时准确控制函数返回的内容(即 rand())?

c# - 如何模拟 Application.Current 进行单元测试?

python - 为迭代定制 unittest.mock.mock_open

python - 如何使用模拟测试 boto3 资源下载文件引发 404 错误?

python - 如何将 mock_open 与 Python UnitTest 装饰器一起使用?

python-3.x - pandas 中的列串联

python - 如何使用python检查一个值是否在另一个值的10以内

python - python 包中的函数如何映射到正确的文件名?

groovy - 使用 Spock 验证非 spy 方法调用