2014-05-20 59 views
2

nose軟件包通常用於運行doctests以及專用測試文件中的測試。它似乎即使在doctest文件中,也會嘗試運行setupteardown固件。禁用鼻子運行設置()

當doctesting模塊正好需要一些其它目的命名setup功能 - 它可能是一個Sphinx extension,例如 - nosetests將調用setup和失敗。

爲了清楚起見,這裏是一個例子:

def my_tricky_function(arg): 
    """Do something testable 

    >>> my_tricky_function(1) 
    2 
    """ 
    return arg + arg 


def my_extension(app): 
    ... 


def setup(app): 
    """Establish sphinx hooks""" 
    app.connect('build-finished', my_extension) 

運行nosestests結果:

File ".../site-packages/nose/suite.py", line 291, in setUp 
    self.setupContext(ancestor) 
    File ".../site-packages/nose/suite.py", line 314, in setupContext 
    try_run(context, names) 
    File ".../site-packages/nose/util.py", line 468, in try_run 
    return func(obj) 
    File "sphinx_ext.py", line 14, in setup 
    app.connect('build-finished', my_extension) 
AttributeError: 'module' object has no attribute 'connect' 

(注意:當setup接受一個參數,nosetest穿過其中setup是一個範圍名稱,在這種情況下,模塊)。

請注意,以下不(似乎適用):

+0

只是在黑暗中拍攝 - 設置'my_tricky_function.setup = None'幫助嗎? – alecxe

回答

0

我發現以下有些哈克溶液沒有命令行選項:添加另一個功能setup_module這將隱藏setup從鼻子。

... 

def setup(app): 
    """Establish sphinx hooks""" 
    app.connect('build-finished', my_extension) 

def setup_module(): 
    pass 
1

儘管joeln自己的回答很漂亮,但它確實污染了模塊的頂級命名空間。

我會檢查參數setup()區分nosetests呼叫和正常呼叫。在你的情況下,如果app是一個模塊(或沒有connect屬性),只需返回並不做任何事情。

def setup(app): 
    """Establish sphinx hooks""" 
    if hasattr(app, 'connect'): 
     app.connect('build-finished', my_extension) 

我有這個問題,自定義setuptools.setup(**kwargs)絆倒了鼻子。雖然nosetests在沒有任何參數的情況下調用它,但setup()的正常用法總會傳入一些關鍵字參數,這使我可以區分這兩種情況。