【发布时间】:2012-10-05 20:55:47
【问题描述】:
我有一个 Python TestCase 类,除了一个之外,所有测试方法都需要以相同的方式修补对象。另一种方法需要来自同一对象的一些其他行为。我正在使用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在Tests周围的那个之前被调用,并且由于mock按顺序应用补丁,类装饰器覆盖了方法装饰器。
这个顺序正确吗?我期待相反的结果,但我不确定如何覆盖补丁......也许使用with 声明?
【问题讨论】:
-
test_override必须在Tests中吗?我可以想象有另一个TestCase用于test_override和类似的测试。如果您希望所有method_to_patch做一件事,但为test_override做另一件事,那么我也可以想象拥有另一个TestCase课程是合理的。这也将解决您的问题,并使代码对其他开发人员更具可读性(与“打补丁”相比)。 -
@SimeonVisser 将
test_override移动到另一个类并不是一个真正的选择,因为我们用于构建测试的规则。它们都是相对于同一个视图的测试,所以我们将它们放在一个TestCase