[英]Overriding Python mock's patch decorator
我有一个Python TestCase
类,除了一个测试方法之外,所有测试方法都需要以相同的方式修补对象。 另一种方法需要来自同一对象的一些其他行为。 我正在使用模拟 ,所以我做了:
@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
打造, @patch
周围test_override
被称为一绕前Tests
,由于mock
应用补丁才能,类装饰压倒一切的方法装饰。
这个订单是否正确? 我期待相反的情况,我不确定如何覆盖修补......也许用with
语句?
好吧,事实证明,良好的睡眠和冷水淋浴使我重新思考整个问题。 我对嘲讽的概念还很陌生,所以它仍然没有完全正确地沉没。
问题是,没有必要将补丁覆盖到模拟对象。 这是一个模拟对象,这意味着我可以做任何事情。 所以我的第一次尝试是:
@mock.patch('method_to_patch', mock.Mock(return_value=1))
class Tests(TestCase):
def test_override(self):
method_to_patch.return_value = 2
(....)
这有效,但有副作用,改变所有后续测试的返回值。 那么我试过:
@mock.patch('method_to_patch', mock.Mock(return_value=1))
class Tests(TestCase):
def test_override(self):
method_to_patch.return_value = 2
(....)
method_to_patch.return_value = 1
它就像一个魅力。 但似乎代码太多了。 那么我就走上了上下文管理的道路,就像这样:
@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
装饰器的应用顺序,它实际上是正确的顺序。 就像从下到上应用堆叠装饰器一样,应该在类装饰器之前调用方法装饰器。 我想这很有道理,我只是期待相反的行为。
无论如何,我希望这将有助于一些像我一样可怜的新手灵魂。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.