【发布时间】:2014-10-27 06:57:30
【问题描述】:
我目前正在创建一些单元测试。我对他们很陌生,只是想弄湿我的脚。所以我正在尝试运行的当前测试是根据用户输入检查预期的输出。所以我会用某种类型的值修补输入,然后检查最后是否收到了标准输出消息。听起来有点混乱,但我希望有人能提供帮助。这是我的运行代码。
def main():
Attack = input("Are we being attacked?!")
if(Attack == "yes"):
print("We are being attacked! Attack Back!")
所以在上面的示例中,我将测试 print 语句,因为我将使用 yes 值修补用户输入。这是我的测试套件
import unittest
from unittest.mock import patch
import io
import sys
from RunFile import main
class GetInputTest(unittest.TestCase):
@patch('builtins.input', return_value='yes')
def test_output(self):
saved_stdout = sys.stdout
try:
out = io.StringIO()
sys.stdout = out
main()
output = out.getvalue().strip()
self.assertEqual(output, "We are being attacked! Attack Back!")
finally:
sys.stdout = saved_stdout
if __name__ == "__main__":
unittest.main()
所以这显然行不通。那么我错过了什么?提前谢谢大家!
已编辑:这是我在运行测试时收到的错误消息。我了解这个错误,只是不知道如何解决它。
Error
Traceback (most recent call last):
File "C:\Python33\lib\unittest\mock.py", line 1087, in patched
return func(*args, **keywargs)
TypeError: test_output() takes 1 positional argument but 2 were given
【问题讨论】:
-
明显吗?相反会发生什么?
"We are being attacked! Attack Back!"与"Hello Pirate!"有什么关系? -
糟糕。我的错。完全忘记改变了。但无论如何它仍然不适合我。我编辑了我的代码。 @jonrsharpe
-
您确定在您的测试中调用了正确的“main()”吗?会发生什么?它只是在断言上失败了?
-
我编辑了我的代码以专门导入 main。我还包括了运行代码时收到的错误消息。我明白它告诉我什么,但不知道如何解决它。 @troylshields
-
尝试在测试中添加一个参数,如下所示: def test_output(self, random): 看看它的作用。
标签: python unit-testing if-statement