1

我有一个简单的 pytest 夹具来确保测试数据文件存在(并在测试结束时删除),但如果给我标题中描述的错误。

@pytest.fixture
def ensure_test_data_file(request):
    data_file = server.DATA_FILE_NAME
    with open(data_file, 'w') as text_file:
        text_file.write(json.dumps(TEST_DATA))
        text_file.close()

    print(os.path.abspath(data_file))

    request.addfinalizer(os.remove(data_file))

如果我删除终结器,它可以工作(除了文件没有被删除)。难道我做错了什么?

4

1 回答 1

2

您需要将一个函数对象传递给request.addfinalizer- 您实际上正在调用 os.remove(data_file),它返回None,因此您正在做request.addfinalizer(None).

在这里,您将使用request.addfinalizer(lambda: os.remove(data_file))orrequest.addfinalizer(functools.partial(os.remove, data_file))来获取带有已“应用”参数的可调用对象,但实际上并未调用该参数。

但是,我建议yield在夹具中使用(docs),通过让您“暂停”夹具并在两者之间运行测试,这使得这更加清洁:

@pytest.fixture
def ensure_test_data_file(request):
    data_file = server.DATA_FILE_NAME
    with open(data_file, 'w') as text_file:
        text_file.write(json.dumps(TEST_DATA))
        text_file.close()

    print(os.path.abspath(data_file))

    yield

    os.remove(data_file)
于 2016-03-18T06:17:17.613 回答