模拟方法的返回值无效

7
在测试 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,因为我已经模拟了它。

有人能解释一下我做错了什么吗?

1个回答

4
我发现你在函数内创建了一个Mock对象,但实际上没有使用它。看起来你需要在使用该Mock的函数中进行修补(patch)。
/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

在此特别讲解 patch: https://docs.python.org/3/library/unittest.mock.html#unittest.mock.patch


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接