我有一个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
语句?在
好吧,结果是晚上睡个好觉和洗个冷水澡让我重新考虑了整个问题。 我对嘲弄这个概念还是很陌生的,所以还没有完全理解。在
问题是,没有必要重写mocked对象的补丁。它是一个模拟对象,这意味着我可以让它做任何事情。所以我的第一次尝试是:
这是可行的,但有一个副作用,即更改所有后续测试的返回值。所以我试着:
^{pr2}$而且效果很好。但似乎代码太多了。所以我走上了上下文管理的道路,就像这样:
我认为它看起来更清晰、更简洁。在
关于
patch
修饰符的应用顺序,它实际上是正确的顺序。就像从下到上应用堆栈装饰器一样,方法装饰器应该在类装饰器之前调用。我想这是有道理的,我只是期待相反的行为。在不管怎样,我希望这能帮助像我这样的可怜的新手。在
相关问题 更多 >
编程相关推荐