【问题标题】:patch django.conf settings does not mutate the value补丁 django.conf 设置不会改变值
【发布时间】:2018-05-04 07:59:02
【问题描述】:

我在base.py 中有VOUCHERED_PEOPLE 我需要通过dummy 对其进行测试 我已经阅读了this,以便对settings.VOUCHERED_PEOPLE 进行修补,但它在 Django2 中不起作用

utils.py

from django.conf import settings
def get_voucher_people(mobile_phone: str) -> typing.Dict[str, typing.Union[str, int]]:
    """Read name from base.py"""
    for record in settings.VOUCHERED_PEOPLE:
        if record['mobile_phone'] == mobile_phone:
            return record
    return None

base.py

VOUCHERED_PEOPLE = [{...}, {...}]

tests.py

with patch('poinkbackend.apps.vouchers.utils.settings', VOUCHERED_PEOPLE=dummy):
    from pprint import pprint
    import ipdb;
    ipdb.set_trace()
    give_voucher(sarit.userprofile, True)

尝试1:

with patch.object(settings, 'VOUCHERED_PEOPLE') as mock_settings:
    mock_settings.return_value = dummy

这不起作用。 settings.VOUCHERED_PEOPLE 是一个函数。我必须执行它才能通过settings.VOUCHERED_PEOPLE()得到虚拟人

问题:
补丁不起作用。成为我的dummy不是改变价值

问题:
我哪里错了?

【问题讨论】:

    标签: python django mocking patch pytest-django


    【解决方案1】:

    有一个特定的context manager 用于修改测试中的设置:

    with self.settings(VOUCHERED_PEOPLE=dummy):
        ...
    

    使用pytest-django,可以use settings as a fixture直接修改;它将在每次测试结束时恢复。

    def test_vouchered_people(settings):
        settings.VOUCHERED_PEOPLE=dummy
        ...
    

    【讨论】:

    • 太酷了!下一个项目我将使用UnitTest。这次我很抱歉。我忘了提到我正在使用pytest-django。我只是更新我的问题。非常感谢您的快速响应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多