我正在尝试解决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行添加了except
和setUp
。)
问题:在上下文管理器中,如果在TestContextDecorator
测试失败的情况下运行类似于try
的函数,那么正确的方法是什么?我使用的except
和tearDown
方法是否正确?或者我们是否可以在setUp
的{{1}}内实际使用try
?