如果setUp在测试中失败,则上下文管理器装饰器永远不会运行__exit__

时间:2018-02-12 19:50:06

标签: django python-3.x python-decorators contextmanager django-unittest

我正在尝试解决django中的bug。该bug涉及一个名为TextContextDecorator的类,它可以用作类装饰器和/或上下文管理器。

正如错误描述所提到的,当使用TextContextDecorator作为类装饰器enable时会在{​​{1}}之前调用,而Test.setUp会在disable之后调用。如果Test.tearDown内部发生故障,则不会调用tearDown。这可能会导致意外行为。

建议的解决方案之一是在setUp的{​​{1}}内使用addCleanUp,但是我在修饰器类中调用该函数时遇到了困难。

以下是重现错误的示例代码..

setUp

到目前为止,我在TestContextDecorator的{​​{1}}内使用了class example_decorator(TestContextDecorator): some_var = False def enable(self): self.__class__.some_var = True def disable(self): self.__class__.some_var = False class Example1TestCase(TestCase): def test_var_is_false(self): # some_var will be False self.assertFalse(example_decorator.some_var) @example_decorator() class Example2TestCase(TestCase): def setUp(self): raise Exception def test_var_is_true(self): # won't be hit due to exception in setUp self.assertTrue(example_decorator.some_var) class Example3TestCase(TestCase): def test_var_is_false(self): # some_var will be True now due to no cleanup in Example2TestCase self.assertFalse(example_decorator.some_var) try,这似乎解决了这个问题,但我不确定它是不是最好的方式去做吧。以下是我made的更改(我在链接中提供的代码的第30行添加了exceptsetUp。)

问题:在上下文管理器中,如果在TestContextDecorator测试失败的情况下运行类似于try的函数,那么正确的方法是什么?我使用的excepttearDown方法是否正确?或者我们是否可以在setUp的{​​{1}}内实际使用try

0 个答案:

没有答案