如何使pytest的fixture f和f1返回as_file实例?
问题分析与解决方案
你的代码存在两个核心问题:
as_file作为普通fixture无法直接接收参数,需要改造成工厂fixture(返回一个可调用的函数)来接收文件名参数。- 原代码中用
with open返回文件对象,with块结束后文件会被立即关闭,导致测试中访问文件属性时会报错(文件已关闭)。
修正后的代码如下:
import pytest # 改造为工厂fixture,返回一个可打开文件的函数,同时确保测试后自动关闭文件 @pytest.fixture def as_file(): opened_files = [] def _open(filename): f = open(filename) opened_files.append(f) return f yield _open # 测试结束后关闭所有打开的文件 for f in opened_files: if not f.closed: f.close() # 调用工厂fixture获取指定文件的实例 @pytest.fixture def f(as_file): return as_file("f.txt") @pytest.fixture def f1(as_file): return as_file("f1.txt") # 修正测试函数中的笔误(f2改为f1) def test_files(f, f1): assert f.name == "f.txt" assert f1.name == "f1.txt"
关键说明:
as_file现在返回一个内部函数_open,这个函数可以接收文件名参数并打开文件,同时记录所有打开的文件句柄。- 使用
yield关键字,在测试执行完成后自动关闭所有打开的文件,避免资源泄漏。 - 测试函数中修正了笔误,将
f2改为f1,确保能正确获取对应的fixture实例。
内容的提问来源于stack exchange,提问作者jjk
相关产品推荐
相关产品推荐

