我有一个方法,它调用其中的另外两个方法。
def main_method(self, query):
result = self.method_one(query)
count = self.method_two(result)
return count
def method_one(self, query):
#Do some stuff based on results.
#This method hits the database.
return result
def method_two(self, result):
#Do some stuff based on result.
#This method also hits the database.
return count我在单元测试方面经验不是很丰富,也从来没有使用过Mocks和Stub。
我不太确定如何为我的第一个方法创建单元测试。由于method_one和method_two多次访问数据库,而且代价非常高,因此我决定使用mox创建一个模拟或存根,以消除访问数据库的需要。
如果有使用Mocks和Stubs的经验的人给我一些关于使用mock和stub的提示,我会非常感激。
发布于 2011-06-04 07:47:22
在担心测试main_method()之前,请先测试较小的方法。以method_one()为例。出于讨论的目的,我们假设它存在于如下类中:
class Foo(object):
def method_one(self, query):
# Big nasty query that hits the database really hard!!
return query.all()为了在不访问数据库的情况下测试该方法,我们需要一个知道如何响应all()方法的对象。例如:
class MockQuery(object):
def all(self):
return [1,2]现在我们可以测试它了:
f = Foo()
q = MockQuery()
assert f.method_one(q) == [1,2]这是一个基本的说明。现实世界往往更加复杂。为了使编写测试的麻烦变得值得,您的模拟all()可能会做一些比返回一个常量更有趣的事情。类似地,如果method_one()包含一堆其他逻辑,那么我们的MockQuery可能需要更详细--也就是说,能够适当地响应更多的方法。通常,在尝试测试代码时,您会意识到您的原始设计负担过重:您可能需要将method_one()重构为更小、更严格定义的部分,从而使其更易于测试。
将相同的逻辑在层次结构中向上推进一步,您可以创建一个MockFoo类,它知道如何以简化的方式响应method_one()和method_two()。
https://stackoverflow.com/questions/6233499
复制相似问题