重写Python mock的补丁d

2024-09-30 14:23:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个PythonTestCase类,在这个类中,除了一个之外,所有的测试方法都需要以相同的方式修补对象。另一个方法需要来自同一对象的其他行为。我正在使用mock,所以我做了:

@mock.patch('method_to_patch', mock.Mock(return_value=1))
class Tests(TestCase):

    @mock.patch('method_to_patch', mock.Mock(return_value=2))
    def test_override(self):
         (....)

但那没用。当test_override运行时,它仍然从类装饰器调用修补的行为。在

经过大量调试,我发现在TestSuite构建过程中,test_override周围的@patch是在{}周围的一个之前被调用的,并且由于mock按顺序应用补丁,类装饰器重写了方法装饰器。在

这个顺序正确吗?我期待的是相反的,我真的不知道如何覆盖补丁。。。也许用with语句?在


Tags: to对象方法testreturn顺序value方式
1条回答
网友
1楼 · 发布于 2024-09-30 14:23:47

好吧,结果是晚上睡个好觉和洗个冷水澡让我重新考虑了整个问题。 我对嘲弄这个概念还是很陌生的,所以还没有完全理解。在

问题是,没有必要重写mocked对象的补丁。它是一个模拟对象,这意味着我可以让它做任何事情。所以我的第一次尝试是:

@mock.patch('method_to_patch', mock.Mock(return_value=1))
class Tests(TestCase):

    def test_override(self):
         method_to_patch.return_value = 2
         (....)

这是可行的,但有一个副作用,即更改所有后续测试的返回值。所以我试着:

^{pr2}$

而且效果很好。但似乎代码太多了。所以我走上了上下文管理的道路,就像这样:

@mock.patch('method_to_patch', mock.Mock(return_value=1))
class Tests(TestCase):

    def test_override(self):
         with mock.patch('method_to_patch', mock.Mock(return_value=2):
             (....)

我认为它看起来更清晰、更简洁。在

关于patch修饰符的应用顺序,它实际上是正确的顺序。就像从下到上应用堆栈装饰器一样,方法装饰器应该在类装饰器之前调用。我想这是有道理的,我只是期待相反的行为。在

不管怎样,我希望这能帮助像我这样的可怜的新手。在

相关问题 更多 >