Pytest fixture finalizer TypeError 'NoneType' object 不可调用

Pytest fixture finalizer TypeError 'NoneType' object is not callable

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

@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))

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

您需要将函数对象传递给 request.addfinalizer - 您所做的实际上是 调用 os.remove(data_file),returns None,因此您正在做 request.addfinalizer(None)

在这里,您将使用 request.addfinalizer(lambda: os.remove(data_file))request.addfinalizer(functools.partial(os.remove, data_file)) 来获得参数已经 "applied" 的可调用对象,但实际上并没有调用它。

但是,我建议在夹具中使用 yield 而不是 (docs),这样可以让您 "pause" 您的夹具和 运行中间的测试:

@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)