2011-06-10 132 views
4

我有一個非常大的測試套件,我裝飾了一些test_ *函數。現在我不能通過./test.py MySqlTestCase.test_foo_double給他們打電話,python3.2抱怨:ValueError: no such test method in <class '__main__.MySqlTestCase'>: result。我的裝飾代碼如下所示:python unittest:不能調用裝飾測試

def procedure_test(procedure_name, arguments_count, returns): 

    '''Decorator for procedure tests, that simplifies testing whether procedure 
    with given name is available, whether it has given number of arguments 
    and returns given value.''' 

    def decorator(test): 
     def result(self): 
      procedure = self.db.procedures[self.case(procedure_name)] 
      self.assertEqual(len(procedure.arguments), arguments_count) 
      self.assertEqual(procedure.returns, 
          None if returns is None else self.case(returns)) 
      test(self, procedure) 
     return result 
    return decorator 

和測試方法:

@procedure_test('foo_double', 0, 'integer') 
def test_foo_double(self, procedure): 
    self.assertEqual(procedure.database, self.db) 
    self.assertEqual(procedure.sql, 'RETURN 2 * value') 
    self.assertArguments(procedure, [('value', 'int4')]) 

回答

4

我認爲這個問題是裝飾功能不具有相同的名稱,並且還,它不滿足被認爲是測試方法的模式。

使用functools.wrap裝飾decorator應該解決您的問題。更多信息here

+0

不錯,很高興知道,謝謝。 – gruszczy 2011-11-17 11:53:35

+0

如果我想裝飾很多測試,該怎麼辦? – pt12lol 2016-09-02 11:16:50

0

這幫助我:

from functools import wraps 

...

@wraps(procedure_name) 
def decorator(test): 
0

基於this後:

你可以這樣來做:

def decorator(test): 
    def wrapper(self): 
     # do something interesting 
     test(self) 
     # do something interesting 
    wrapper.__name__ = test.__name__ 
    return wrapper 

該解決方案有兩個優點年齡在法@functools.wrap

  • 不需要任何進口
  • 創建

由於該解決方案的第二個特徵裝飾時並不需要知道測試的名字,它可以爲許多測試創建裝飾器。