首页 > 解决方案 > 模拟内部方法 Python2

问题描述

我是新手,我真的很努力。主要在文档和大多数 SO 页面中,它显示了如何获取 mock result_value,但我想检查我从方法获得的值是否正确,而不是result_value's. 这是示例:

#!/usr/bin/env python

class Example:

    def one(self):
        return 1

    def two(self, one):
        print(one + 1) # basically any void method, ex: result = one + 1 and check result value if correct

    def main(self):
        self.two(self.one())

if __name__ == '__main__':
    e = Example()
    e.main()

测试:

#!/usr/bin/env python

import unittest
import example
from mock import patch

class Example(unittest.TestCase):

    def test_one(self):
        self.assertEqual(1, et.one())

    def test_two(self):
        with patch('example.Example.two'):
            self.assertEqual(2, et.two(et.one())) # ..the part I'm stuck
                                                  # whick ofc throws AssertionError: 2 != <MagicMock name='two()' id='blablabla'>

    def test_main(self):
        # unknown part..

if __name__ == '__main__':
    et = example.Example()
    unittest.main()

如何用unittest实现void方法检查?

更新:

所以我在 chepner 的帮助下得出的印刷品:

def test_twoi3(self):
        mock_print = MagicMock()
        with patch('sys.stdout', mock_print):
            print(2)
            expected = call.write('2')
            self.assertEqual(mock_print.mock_calls[0], expected)

因为main我不太确定这是否是一个好的解决方案......:

def test_main(self):
        with patch ('example.Example.main') as m:
            et.main(et.two(1))
        m.assert_called_with(et.two(1))

但我不想通过传递方法和值来检查,而是通过main调用其他两种方法来检查。如何做到这一点?

标签: pythonmockingpython-2.6

解决方案


你不需要嘲笑任何东西(直接,反正);您想要捕获标准输出并验证它是否符合您的期望。

from contextlib import redirect_stdout
from io import StringIO

def test_two(self):
    stdout = StringIO()

    with redirect_stdout(stdout):
        et.two(et.one())

    self.assertEqual(stdout.getvalue(), "2\n")

或者,您可以模拟print并检查它是否使用预期的参数调用

def test_two(self):
    with patch('__builtin__.print') as p:
        et.two(et.one())

    p.assert_called_with(2)

推荐阅读