在Django中如何在导入期间模拟一个由views.py调用的对象方法?

问题描述 投票:0回答:1

我正在为我的Django应用程序编写系统测试,在那里我通过HTTP请求测试完整的应用程序并模拟其外部依赖项的API。

在views.py我有类似的东西:

from external_service import ExternalService
externalService = ExternalService
data = externalService.get_data()

@crsf_exempt
def endpoint(request):
    do_something()

我想要的是模拟(或存根)ExternalService以在调用其方法get_data()时返回预定义的响应。

问题是,当我运行python manage.py test时,在我的测试类之前加载views.py。因此,当我用模拟的对象修补对象时,函数get_data(已被调用。

This solution也没有工作。

python django python-unittest python-mock
1个回答
0
投票

首先,不要在导入时调用您的方法。那肯定不是必要的吗?

如果get_data做类似get的请求,例如

def get_data():
    response = requests.get(DATA_URL)
    if response.ok:
        return response
    else:
        return None

然后你可以嘲笑它;

from unittest.mock import Mock, patch

from nose.tools import assert_is_none, assert_list_equal

from external_service import ExternalService


@patch('external_service.requests.get')
def test_getting_data(mock_get):
    data = [{
        'content': 'Response data'
    }]

    mock_get.return_value = Mock(ok=True)
    mock_get.return_value.json.return_value = data

    response = ExternalService.get_data()

    assert_list_equal(response.json(), data)


@patch('external_service.requests.get')
def test_getting_data_error(mock_get):
    mock_get.return_value.ok = False

    response = ExternalService.get_data()

    assert_is_none(response)

为此你需要pip install nose,如果你还没有它。

© www.soinside.com 2019 - 2024. All rights reserved.