尝试使用pytest和capsys访问stdout时发生ValueError

thekid77777

尝试在验证用户帐户的对象中测试本地方法的标准输出。

举个例子,

class Foo:
    def __init__(self, bar, baz):
        self.bar = bar
        if baz:
            self.something = self.load_something()
        else:
            print('Error initializing')

    def load_something(self):
        return ''

    def make_subprocess_call(self):
        return 'stdout', 'stderr'
    
    def confirm_something(self):
        subprocess_stdout, subprocess_stderr = self.make_subprocess_call()
        if subprocess_stdout:
            print('good output')
        else:
            print('err output', subprocess_stderr)

然后测试:

from Foo_Class_File import Foo
import mock
import pytest

@mock.patch('Foo_Class_File.Foo.load_something', return_value = {'a': 'b'})
@mock.patch('Foo_Class_File.Foo.make_subprocess_call', return_value=('more stdout', 'more_stderr'))
def test_confirm_something(testdir, capsys):
    test_foo = Foo(testdir, True)
    test_foo.confirm_something()
    out, err = capsys.readouterr()
    assert out == 'more stdout'
    assert err == 'more_stderr'

然后运行:

python3 -m pytest test_foo_file.py

给出:

============================================================================== FAILURES ===============================================================================
_______________________________________________________________________ test_confirm_something ________________________________________________________________________

testdir = <MagicMock name='make_subprocess_call' id='140533346667632'>, capsys = <MagicMock name='load_something' id='140533346970400'>

    @mock.patch('Foo_Class_File.Foo.load_something', return_value = {'a': 'b'})
    @mock.patch('Foo_Class_File.Foo.make_subprocess_call', return_value=('more stdout', 'more_stderr'))
    def test_confirm_something(testdir, capsys):
        test_foo = Foo(testdir, True)
        test_foo.confirm_something()
>       out, err = capsys.readouterr()
E       ValueError: not enough values to unpack (expected 2, got 0)

blah.py:10: ValueError
------------------------------------------------------------------------ Captured stdout call -------------------------------------------------------------------------
good output
======================================================================= short test summary info =======================================================================
FAILED test_foo_file.py::test_confirm_something - ValueError: not enough values to unpack (expected 2, got 0)
========================================================================== 1 failed in 0.11s ==========================================================================

我真的很困惑,因为它说正在捕获标准输出?

我认为这与实例化对象然后调用方法有关,因为如果只有对象,我用capsys捕获就没有问题,但是一旦我尝试实例化它并调用方法,您在它上面看到的内容怎么了。我找不到在线或文档中的类似案例,不是因为缺乏尝试(或者我的Google foo今天很虚弱)。

抱歉,如果我做一些愚蠢的事情,但此时我担心键盘的安全性并认为我会伸出援手。任何帮助/建议表示赞赏。您可以运行我发布的这个测试用例,它应该给您与发布的相同的错误。

不来梅先生

您的问题是您提供了补丁装饰器,但没有将相应的参数添加到测试函数中。这是正确的:

@mock.patch('Foo_Class_File.Foo.load_something', return_value = {'a': 'b'})
@mock.patch('Foo_Class_File.Foo.make_subprocess_call', return_value=('more stdout', 'more_stderr'))
def test_confirm_something(mocked_call, mocked_load, testdir, capsys):  # note the additional arguments
    test_foo = Foo(testdir, True)
    test_foo.confirm_something()
    out, err = capsys.readouterr()
    assert out == 'good output\n'
    assert err == ''

或者,或者:

@mock.patch('Foo_Class_File.Foo.load_something')
@mock.patch('Foo_Class_File.Foo.make_subprocess_call')
def test_confirm_something(mocked_call, mocked_load, testdir, capsys):
    mocked_call.return_value = ('more stdout', 'more_stderr')
    mocked_load.return_value = {'a': 'b'}
    test_foo = Foo(testdir, True)
    ...

您的代码中发生的事情是,夹具testdircapsys都被用作模拟参数(它们应作为测试函数中的第一个参数),从而导致两者都是模拟对象而不是夹具。

旁注:如果在这种情况下pytest发出警告,那会很好,例如“您正在使用灯具名称作为修补对象的名称,也许您忘记添加修补对象参数了?” ...

请注意,我已将示例代码中的断言替换为实际使用您的代码传递的断言。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

尝试从消息访问正文时发生InvalidOperationException

来自分类Dev

尝试访问对象数组时发生NullPointerException

来自分类Dev

尝试使用成员函数访问动态分配的成员变量时发生读取访问冲突

来自分类Dev

安装和运行Tensorflow时发生ValueError

来自分类Dev

尝试将Dictionary转换为DataFrame Pandas时发生ValueError

来自分类Dev

尝试从Keras运行顺序模型时发生ValueError

来自分类Dev

尝试基于字典的日志记录配置时发生Python ValueError

来自分类Dev

使用Tensorflow执行Matmul时发生ValueError

来自分类Dev

尝试使用webrtcvad时发生错误

来自分类Dev

尝试使用tkFont时发生AttributeError

来自分类Dev

尝试使用tkFont时发生AttributeError

来自分类Dev

尝试访问jar文件中的资源时发生异常

来自分类Dev

尝试写入新文件时发生FileNotFoundException(访问被拒绝)

来自分类Dev

尝试进行内存分配时发生访问冲突错误

来自分类Dev

尝试检查char *是否为double时发生访问冲突

来自分类Dev

尝试访问jar文件中的资源时发生异常

来自分类Dev

尝试写入新文件时发生FileNotFoundException(访问被拒绝)

来自分类Dev

使用 Ansible 时访问 stdout_lines

来自分类Dev

使用乘客和Rails应用启动Nginx时如何访问Rails应用的控制台(stdout)?

来自分类Dev

使用Xlib的XCreateSimpleWindow时发生访问冲突

来自分类Dev

事件代码:4011尝试使用处理程序上载文件时发生未处理的访问异常

来自分类Dev

使用 map 和 pluck 在管道中访问列表列中的值时发生变异

来自分类Dev

尝试使用OAuth访问SmartCloud时出错

来自分类Dev

尝试使用指针访问结构时出错

来自分类Dev

使用pandas.read_json时发生ValueError

来自分类Dev

使用scipy minimum_squares时发生ValueError

来自分类Dev

使用cv2.findContours()OpenCV时发生ValueError

来自分类Dev

在Python 3中使用Keras时发生ValueError

来自分类Dev

在Keras中使用vae.fit时发生ValueError

Related 相关文章

  1. 1

    尝试从消息访问正文时发生InvalidOperationException

  2. 2

    尝试访问对象数组时发生NullPointerException

  3. 3

    尝试使用成员函数访问动态分配的成员变量时发生读取访问冲突

  4. 4

    安装和运行Tensorflow时发生ValueError

  5. 5

    尝试将Dictionary转换为DataFrame Pandas时发生ValueError

  6. 6

    尝试从Keras运行顺序模型时发生ValueError

  7. 7

    尝试基于字典的日志记录配置时发生Python ValueError

  8. 8

    使用Tensorflow执行Matmul时发生ValueError

  9. 9

    尝试使用webrtcvad时发生错误

  10. 10

    尝试使用tkFont时发生AttributeError

  11. 11

    尝试使用tkFont时发生AttributeError

  12. 12

    尝试访问jar文件中的资源时发生异常

  13. 13

    尝试写入新文件时发生FileNotFoundException(访问被拒绝)

  14. 14

    尝试进行内存分配时发生访问冲突错误

  15. 15

    尝试检查char *是否为double时发生访问冲突

  16. 16

    尝试访问jar文件中的资源时发生异常

  17. 17

    尝试写入新文件时发生FileNotFoundException(访问被拒绝)

  18. 18

    使用 Ansible 时访问 stdout_lines

  19. 19

    使用乘客和Rails应用启动Nginx时如何访问Rails应用的控制台(stdout)?

  20. 20

    使用Xlib的XCreateSimpleWindow时发生访问冲突

  21. 21

    事件代码:4011尝试使用处理程序上载文件时发生未处理的访问异常

  22. 22

    使用 map 和 pluck 在管道中访问列表列中的值时发生变异

  23. 23

    尝试使用OAuth访问SmartCloud时出错

  24. 24

    尝试使用指针访问结构时出错

  25. 25

    使用pandas.read_json时发生ValueError

  26. 26

    使用scipy minimum_squares时发生ValueError

  27. 27

    使用cv2.findContours()OpenCV时发生ValueError

  28. 28

    在Python 3中使用Keras时发生ValueError

  29. 29

    在Keras中使用vae.fit时发生ValueError

热门标签

归档