在 python 3.4.1 中,如何在 unittest 中断言这样的错误?

In python 3.4.1, how can I assert an error in unittest like this?

比如我定义了一个像

这样的函数
def f(n): return 1+'1'

在单元测试中,我定义了 test_error:

assertRaises(TypeError,f(1))

但它只是表明这是一个错误。但是当我定义 f 时没有像

这样的参数
def f(): return 1+'1'

并在单元测试中

assertRaises(TypeError,f)

它工作得很好。这是为什么?如何处理带参数的函数?

这是因为您应该将函数参数与其参数一起传递:

self.assertRaises(TypeError, f, 1)

仅供参考,根据 documentation,这是 assertRaises() 合同:

assertRaises(exception, callable, *args, **kwds)

其中 callable 是您的 f 函数,*args**kwds 是您传递的位置和关键字参数。

您在 将其交给 assertRaises() 方法之前调用了第一个函数 。你可以给方法额外的参数,然后它会传递给被测函数:

self.assertRaises(TypeError, f, 1)

更好的选项是使用self.assertRaises()作为上下文管理器:

with self.assertRaises(TypeError):
    f(1)

你在那种情况下调用方法'normally',这样读起来更自然。

参见 TestCase.assertRaises() documentation:

Test that an exception is raised when callable is called with any positional or keyword arguments that are also passed to assertRaises().

If only the exception and possibly the msg arguments are given, return a context manager so that the code under test can be written inline rather than as a function:

with self.assertRaises(SomeException):
    do_something()