擅长:python、mysql、java
<p>当测试运行时,在调用self.assertRaises之前,Python需要找到所有方法参数的值。在这样做的时候,它计算<code>branch[0].children_nodes</code>,这会引发AttributeError。由于我们尚未调用assertRaises,因此未捕获此异常,从而导致测试失败。</p>
<p>解决方法是将<code>branch[0].children_nodes</code>包装在函数或lambda中:</p>
<pre><code>self.assertRaises(AttributeError, lambda: branch[0].children_nodes)
</code></pre>
<p>assertraise也可以用作上下文管理器(自Python 2.7以来,或在PyPI包“unittest2”中):</p>
<pre><code>with self.assertRaises(AttributeError):
branch[0].children_nodes
# etc
</code></pre>
<p>这很好,因为它可以在测试过程中用于任意代码块,而不必创建一个新函数来定义它所应用的代码块。</p>
<p>如果需要,它可以让您访问引发的异常以进行进一步处理:</p>
<pre><code>with self.assertRaises(AttributeError) as cm:
branch[0].children_nodes
self.assertEquals(cm.exception.special_attribute, 123)
</code></pre>