【发布时间】:2020-01-21 15:31:05
【问题描述】:
我是新手,我真的很挣扎。主要在文档和大多数 SO 页面中,它显示了如何获取模拟 result_value,但我想检查我从方法中获得的值是否正确,而不是 result_value 的值。示例如下:
#!/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 是否调用其他两个方法。如何做到这一点?
【问题讨论】:
-
您需要捕获标准输出,而不是检查其返回值。模拟在这里并不合适,因为模拟取代了身体,消除了副作用。你不能模拟你想测试的东西。
-
@chepner 好的,如果方法已被调用并获取它们的值(不是 return_value),如何测试
main? -
您可以模拟
print,并检查它是否以预期值被调用,而不是实际写入标准输出。 -
或使用
contextlib.redirect_stdout将标准输出捕获到您可以检查其内容的StringIO对象。 -
@chepner 与
print结果为None(代码:with patch('__builtin__.print', mock_print): self.assertEqual(2, et.two(1))
标签: python mocking python-2.6