我想测试是否使用unittest
引发并捕获了一个正确的异常。
以下是我的示例代码:
def foo():
try:
raise Exception(ValueError)
except ValueError:
print "raised"
以下是我想做的事情:
self.assertRaises(ValueError, foo)
由于我发现异常,我无法assertRaise
异常。
我错过了什么或有其他方式吗?
我的完整代码:
#!/usr/bin/python
import unittest
def foo():
try:
raise ValueError
except ValueError, e:
print "caught"
class tester(unittest.TestCase):
def test1(self):
with self.assertRaises(ValueError):
foo()
def test2(self):
self.assertRaises(ValueError, foo)
if __name__ == '__main__':
unittest.main()
答案 0 :(得分:2)
不,你不能测试只在函数内部产生影响的东西。
您可以做的是将引发异常的代码拆分为自己的函数,然后对其进行测试以检查是否引发了异常(使用assertRaises
)。原始函数可以调用那个函数,如果你对该函数进行正常测试,那么显然它会捕获异常。
然而,这是否是一个好主意取决于你的功能。为什么重要该函数在某个时刻引发异常然后捕获它?也许有一天你会转而采用其他方式做同样的事情,结果相同。你的测试不能继续工作吗?
如果异常只是一个实现细节,你可能根本不应该测试它。
答案 1 :(得分:1)
您可以捕获stdout
并测试字符串匹配。 Pytest为此提供fixture。
#!/usr/bin/python
import unittest
def foo():
try:
raise ValueError
except ValueError, e:
print "caught"
def test_foo(capfd):
foo()
out, err = capfd.readouterr()
assert out == "caught\n"
py.test test.py
============================= test session starts ==============================
platform linux2 -- Python 2.7.9 -- py-1.4.28 -- pytest-2.7.1
rootdir: /tmp, inifile:
collected 1 items
test.py .
=========================== 1 passed in 0.01 seconds ===========================
答案 2 :(得分:0)
尝试从您的函数返回True
或False
。
def foo():
try:
#work flow
return True
except ValueError:
#error handle
return False
self.assertFalse(foo())