pytest fixture未传参返回function对象而非字典问题求助
问题原因
你的default_user fixture实际yield的是内部定义的return_account函数,而非直接返回字典对象。所以:
- 当你调用
default_user(back_up_account="test_account123")时,其实是执行了这个嵌套函数,触发了获取账号的逻辑,返回的是字典或备份账号字符串; - 但直接使用
default_user时,你拿到的就是这个return_account函数本身,自然是function类型,而非执行后的结果。
另外注意你的fixture返回类型标注-> Dict是错误的,因为实际返回的是函数,不是字典,这也会造成误导。
解决办法
方案1:保持现有fixture结构,不传参时主动调用函数
如果想保留当前支持传参的逻辑,不传参时需要调用default_user()来触发函数执行:
def tests_123(self, default_user): self.startup(default_user()) # 加括号调用函数,获取字典结果
方案2:修改fixture,让其默认返回字典,同时支持指定备份账号
如果希望不传参时直接拿到字典,同时保留传参使用备份账号的能力,可以调整fixture的设计:
@pytest.fixture(scope='function') def default_user(self): def get_account(back_up_account: str = None): try: return self.user_util.get_account() except Exception: return back_up_account return get_account
这样不管是default_user()(不传参)还是default_user("test_account123")(传参),都能直接拿到对应结果,同时修正了之前错误的返回类型标注。
或者如果你希望fixture默认直接返回正常的用户字典,额外提供一个带参数的选项,可以拆分fixture:
@pytest.fixture(scope='function') def base_user(self) -> Dict: try: return self.user_util.get_account() except Exception: return None @pytest.fixture(scope='function') def default_user(base_user): def _get_user(back_up_account: str = None): return base_user if base_user is not None else back_up_account return _get_user
这种方式把基础账号获取逻辑拆分,结构更清晰。
内容的提问来源于stack exchange,提问作者blue92138
相关产品推荐
相关产品推荐

