所以我已经有这个问题已经有一段时间了,找不到解决方案。我有这个非常基本的运行代码。当我使用"TEST"
来模拟输入时,我想测试预期的输出side_effects
。第一次调用输入函数时,我模拟'y'
,然后在第二次调用它时模拟'1'
,然后应该触发print
语句。问题是返回的输出是空的。我不知道发生了什么,但是当我手动运行main方法并输入输入时,我得到预期的输出,所以我知道运行代码按预期工作,但在测试期间发生了一些时髦的事情。
这是我的运行代码
def main():
newGame = input("")
if newGame == 'y':
print("1.Scallywag\n2.Crew\n3.Pirate")
difficulty = input("")
if difficulty == '1':
print("TEST")
main()
这是我的测试代码
import unittest
from unittest.mock import patch
import io
import sys
from Run import main
class MyTestCase(unittest.TestCase):
@patch('builtins.input', side_effects=['y','1'])
def test_output(self,m):
saved_stdout = sys.stdout
try:
out = io.StringIO()
sys.stdout = out
main()
output = out.getvalue().strip()
self.assertIn("TEST", output)
finally:
sys.stdout = saved_stdout
if __name__ == "__main__":
unittest.main()
这里是AssertionError
我回到跟踪,请注意它预期""
不应该是这种情况。
F
======================================================================
FAIL: test_output (__main__.MyTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Python33\lib\unittest\mock.py", line 1087, in patched
return func(*args, **keywargs)
File "C:\Users\jsalce\Desktop\Testcases\Test.py", line 20, in test_output
self.assertIn("TEST", output)
AssertionError: 'TEST' not found in ''
----------------------------------------------------------------------
Ran 1 test in 0.006s
FAILED (failures=1)
提前谢谢大家
答案 0 :(得分:0)
Print("String", file=out)
您正在寻找的是什么,但您需要传递给主要的。
答案 1 :(得分:0)
您输入的补丁不能按要求运行,因为您没有给它一个功能。试试这个:
import unittest
from unittest.mock import patch, MagicMock
import io
import sys
from Run import main
class MyTestCase(unittest.TestCase):
#@patch('builtins.input', side_effects=['y','1'])
@patch('builtins.input', MagicMock(side_effect=['y','1']))
def test_output(self):
saved_stdout = sys.stdout
try:
out = io.StringIO()
sys.stdout = out
main()
output = out.getvalue().strip()
self.assertIn("TEST", output)
#I used equals to see if I am truly grabbing the stdout
#self.assertEquals("TEST", output)
finally:
sys.stdout = saved_stdout
if __name__ == "__main__":
unittest.main(verbosity=2)
而且,你的test_output签名中不需要变量'm'。