我正在try 在一些测试中设置一些环境变量来驱动Django项目的配置,这样我就可以模拟一些值,并使断言更容易和明确.

我想用一个文件的名称设置一个环境变量,该文件存储一些配置,如果设置了该变量并且该文件存在,则加载该配置.即:

# proj.settings.py

CONFIG = None
if _filename := os.environ.get('FILE_PATH', None):
    with open(_filename) as f:
        CONFIG = json.load(f)

我try 了一个设置环境变量的装置(请参见set_env),因此我的测试如下所示:

# some_app.tests.test_settings.py

import os

@fixture
def data_raw():
    return dict(
        foo="bar"
    )

@fixture
def data_file(data_raw):
    with NamedTemporaryFile(mode="w+") as f:
        json.dump(data_raw, f)
        yield f.name

@fixture
def set_env(data_file):
    os.environ['FILE_PATH'] = data_file

def test_it_loads_data(set_env, data_raw, settings):
    assert settings.CONFIG == data_raw

但是set_env不会在Django的配置之前执行,所以CONFIG永远不会被设置.

推荐答案

Django设置在导入时运行,因此它将在任何fixture 之前执行.

您也可以通过在导入时设置环境变量来解决此问题:

os.environ['FILE_PATH'] = ...

def test_it_loads_data(set_env, data_raw, settings):
    assert settings.CONFIG == data_raw

但话虽如此,我并不认为这是测试这一点的最佳方法.我认为更可取的做法是将该逻辑移到单独的函数中,然后自行测试:

# utils.py
def loan_config():
    if _filename := os.environ.get('FILE_PATH', None):
        with open(_filename) as f:
            return json.load(f)
    return None

# settings.py
CONFIG = loan_config()

然后,您可以单独测试load_config:

from tempfile import NamedTemporaryFile
import json

def test_load_config():
    mock_data = {"key": "value"}

    # Create a temp file with the mock data
    with NamedTemporaryFile("w", suffix=".json", delete=False) as temp_file:
        json.dump(mock_data, temp_file)
        temp_file.close()

        # Store the temp file path in an env variable
        os.environ["FILE_PATH"] = temp_file.name

        # Call the loan_config function
        result = loan_config()

        # Assert that the function returns the file parsed by json
        assert result == mock_data

        # Clean up the temp file
        os.remove(temp_file.name)

在测试完成后,您可能还应该恢复FILE_PATH env之前的值.否则,这将是一次"泄密"的测试

Python相关问答推荐

Pandas read_jsonfuture 警告:解析字符串时,to_datetime与单位的行为已被反对

Pandas滚动分钟,来自其他列的相应值

如何使用Tkinter创建两个高度相同的框架(顶部和底部)?

Python panda拆分列保持连续多行

实现的差异取决于计算出的表达是直接返回还是首先存储在变量中然后返回

将HTML输出转换为表格中的问题

无法使用equals_html从网址获取全文

线性模型PanelOLS和statmodels OLS之间的区别

使用numpy提取数据块

如何将ctyles.POINTER(ctyles.c_float)转换为int?

在Python中处理大量CSV文件中的数据

使用索引列表列表对列进行切片并获取行方向的向量长度

Godot:需要碰撞的对象的AdditionerBody2D或Area2D以及queue_free?

Python—从np.array中 Select 复杂的列子集

海上重叠直方图

如何使用两个关键函数来排序一个多索引框架?

在Admin中显示从ManyToMany通过模型的筛选结果

基于多个数组的多个条件将值添加到numpy数组

Tensorflow tokenizer问题.num_words到底做了什么?

为用户输入的整数查找根/幂整数对的Python练习