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)
我有一个简单的 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)