在pytest中,如何临时禁用类方法中的捕获?

2024-04-19 14:12:05 发布

您现在位置:Python中文网/ 问答频道 /正文

在pytest(3.04;python3.4)中,我试图在某些情况下禁用输出捕获。我试着以this doc page为例。但是,我无法将capsys指定为funcarg。作为后续操作,我希望同时接受funcarg和on funcarg参数,这样我就可以使用一个接受一个或多个普通参数的类方法。我怎么能做到呢?在

理想情况下,这种类方法可以工作:

    def always_print(self, message, capsys):
        with capsys.disabled():
            print(message)

但是,我甚至不能让它工作:

^{pr2}$

获取错误:

...
>       always_print()
E       TypeError: always_print() missing 1 required positional argument: 'capsys'

编辑1: 皮奥特的回答解决了我的具体问题。然而,我也发现了两个我在文档或其他帖子中没有提到的重要注意事项,因此在这里为他人分享利益:

  1. 看来capsys.已禁用()只适用于stdout和而不是stderr,这是我最初根据*nix最佳实践发送调试消息的地方。在
  2. 如果将文件句柄设置为系统标准输出呼叫之前capsys.已禁用(),那么由于pytest所做的magic文件描述符损坏,这将不起作用。在

因此,例如,您需要这样做(例如,如果您的kwargs可能包含可选的“file”关键字,如内置print()所做的:

 fhandle = kwargs.get('file', sys.stdout) #will not work!
    with capsys.disabled():
        fhandle = kwargs.get('file', sys.stdout) #must be in context
        print(message, file=fhandle)

Tags: 方法message参数pytestwithstdout情况always
1条回答
网友
1楼 · 发布于 2024-04-19 14:12:05

嗯,capsys是一个内置的测试夹具。你应该把它作为测试的论据,然后再通过

def always_print(capsys):
    with capsys.disabled():
        print('FIXME')

def test_always_print(capsys):
    always_print(capsys)

如果您使用pytest命令运行它,它将工作。在

编辑:

为了避免冗长,可以为所有测试准备一些全局capsys变量(基于答案how to share a variable across modules for all tests in py.test):

^{pr2}$

相关问题 更多 >