Overriding Python mock's patch decorator
我有一个Python
1 2 3 4 5 6 | @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): (....) |
但那不起作用。 当
经过大量的调试,我发现在
这个订单是否正确? 我期待相反的情况,我不确定如何覆盖修补...也许用
好吧,事实证明,良好的睡眠和冷水淋浴使我重新思考整个问题。
我对嘲讽的概念还很陌生,所以它仍然没有完全正确地沉没。
问题是,没有必要将补丁覆盖到模拟对象。这是一个模拟对象,这意味着我可以做任何事情。所以我的第一次尝试是:
1 2 3 4 5 6 | @mock.patch('method_to_patch', mock.Mock(return_value=1)) class Tests(TestCase): def test_override(self): method_to_patch.return_value = 2 (....) |
这有效,但有副作用,改变所有后续测试的返回值。那么我试过:
1 2 3 4 5 6 7 | @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 |
它就像一个魅力。但似乎代码太多了。那么我就走上了上下文管理的道路,就像这样:
1 2 3 4 5 6 | @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): (....) |
我觉得它看起来更清晰,更简洁。
关于
无论如何,我希望这将有助于一些像我一样可怜的新手灵魂。