2013-12-09 70 views
2

比方说,我使用的是库的抽象类作为我自己的抽象基类的基础上,所以单元测试 - 嘲讽/抑制对象的__init__

class LibBaseClass(): 

    some_var = None # In any non-abstract versions of this class, this must be set 

    def __init__(self): 
     if some_var is None: 
      raise ImproperlyConfigured("some_var Not set!") 

现在我有一个使用这个类我自己的基类...

class MyBaseClass(LibBaseClass(): 

    some_var = None # Still None, doesn't make sense for this var to be set to anything 

    def my_additional_method(self): 
     .... 

现在,当我来测试MyBaseClass,在setUp()的方法,我想初始化类,所以:

my_class = MyBaseClass() 

但当然这会从库的基类init()中引起错误。我正在寻找围绕这个问题的最新方法,但我完全不知道该怎么模拟。错误不重要/不会影响我编写和运行的任何测试,所以我只需要避开这个特定错误的方法。

+0

不'__init__'做别的除了检查该变种? –

+0

不,它只是作为一个“嘿,你没有正确配置你的孩子班”警告基本上。 – ptr

回答

1

我认为你在这里有一个设计问题:

some_var = None # In any non-abstract versions of this class, this must be set

some_var = None # Still None, doesn't make sense for this var to be set to anything

这两种说法相互矛盾。 因此,您应该设置some_var或停止在未设置时发生异常。 另外,如果MyBaseClass应该是抽象的,你不应该实例化它。

编辑:

但是,如果你真的知道你在做什么,你可以轻松地放下父__init__

MyBaseClass.__init__ = lambda self: None

+0

我同意这是一个设计缺陷,我通常不会像这样在__init__方法中放置配置错误,而是将它放在需要的方法中。我应该怎样在我的孩子 - 仍然抽象类中设置'some_var'来做什么?要添加一个上下文,'some_var'是要呈现的html文件模板。 MyBaseClass永远不会被用作独立的,所以它没有任何意义,它有一个模板。 – ptr

+1

无论如何要思考一下,我发现这个:http://blog.devork.be/2008/12/mocking-away-init-method.html这也涵盖了这个问题。 – ptr