首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mock还是Stubs?

Mock还是Stubs?
EN

Stack Overflow用户
提问于 2011-06-04 07:08:36
回答 1查看 1.1K关注 0票数 4

我有一个方法,它调用其中的另外两个方法。

代码语言:javascript
复制
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的提示,我会非常感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-04 07:47:22

在担心测试main_method()之前,请先测试较小的方法。以method_one()为例。出于讨论的目的,我们假设它存在于如下类中:

代码语言:javascript
复制
class Foo(object):
    def method_one(self, query):
        # Big nasty query that hits the database really hard!!
        return query.all()

为了在不访问数据库的情况下测试该方法,我们需要一个知道如何响应all()方法的对象。例如:

代码语言:javascript
复制
class MockQuery(object):
    def all(self):
        return [1,2]

现在我们可以测试它了:

代码语言:javascript
复制
f = Foo()
q = MockQuery()
assert f.method_one(q) == [1,2]

这是一个基本的说明。现实世界往往更加复杂。为了使编写测试的麻烦变得值得,您的模拟all()可能会做一些比返回一个常量更有趣的事情。类似地,如果method_one()包含一堆其他逻辑,那么我们的MockQuery可能需要更详细--也就是说,能够适当地响应更多的方法。通常,在尝试测试代码时,您会意识到您的原始设计负担过重:您可能需要将method_one()重构为更小、更严格定义的部分,从而使其更易于测试。

将相同的逻辑在层次结构中向上推进一步,您可以创建一个MockFoo类,它知道如何以简化的方式响应method_one()method_two()

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6233499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档