首页 > 解决方案 > 根据正在运行的测试用例切换装饰器的顺序?

问题描述

为了测试功能标志,我正在使用补丁模拟/修补两个函数。

但是,每当我切换这些模拟装饰器的顺序时,都会导致一些测试失败。当我再次切换它们时,那​​些失败的测试通过并且之前通过的测试失败。

据我所知,这是由于 Python 中装饰器的评估顺序所致。

有没有办法为一个特定的测试声明/指定应该首先评估哪个装饰器?

@mock.patch.object(MyMockClass, '_some_function', return_value=False)
@mock.patch.object(MyMockClass, '_another_function', return_value=False)
class MyClassTestCase(TestCase):
    # code...

标签: pythondjangopython-unittestpython-decorators

解决方案


您可以将装饰器单独应用于MyClassTestCase类的每个方法,从而指定评估每个方法的装饰器的顺序。

基本上改变:

@mock.patch.object(MyMockClass, '_some_function', return_value=False)
@mock.patch.object(MyMockClass, '_another_function', return_value=False)
class MyClassTestCase(TestCase):
    def test_that_it_works(self, *args):
        # do test stuff

至:

class MyClassTestCase(TestCase):
    @mock.patch.object(MyMockClass, '_some_function', return_value=False)
    @mock.patch.object(MyMockClass, '_another_function', return_value=False)
    def test_that_it_works(self, mock_another, mock_some):
        # do test stuff

推荐阅读