【问题标题】:Output is empty when mocking input in Python Unit Test在 Python 单元测试中模拟输入时输出为空
【发布时间】:2014-09-19 07:02:05
【问题描述】:

所以我遇到这个问题已经有一段时间了,找不到解决方案。我有这个非常基本的运行代码。当我使用 side_effects 模拟输入时,我想测试预期的输出 "TEST" 。第一次调用输入函数时,我模拟'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)

提前谢谢大家

【问题讨论】:

  • isint stdout 在你的情况下应该是空的吗?既然你输入了'y'(在你的补丁中),difficulty='y' 不符合 if 条件?
  • 我在使用side_effects 时编辑了我的代码(忘记更新),它修补了满足第一个if 语句的'y','1' 应该满足第二个条件。 @阿什温

标签: python unit-testing mocking stdout


【解决方案1】:

你的输入补丁不能按要求工作,因为你没有给它一个功能。试试这个:

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”。

【讨论】:

  • 有了这个我得到以下错误。运行代码保持不变。 NameError: global name 'main' is not defined应该定义
  • 啊!我忘了添加从运行中导入你的 main 的行。编辑了代码。现在试试。我正在使用我的测试脚本进行测试:)
【解决方案2】:
Print("String", file=out)

是你要找的东西,不过你需要传递给 main。

【讨论】:

  • 你能再解释一下吗?这是进入单元测试还是主测试?
猜你喜欢
  • 1970-01-01
  • 2019-04-09
  • 2015-09-16
  • 2018-07-20
  • 2018-03-21
  • 1970-01-01
  • 2014-01-01
  • 2019-01-22
  • 1970-01-01
相关资源
最近更新 更多