项目来源在这里:Matrix
我在测试目录中添加了一个新的测试文件test_utils
。当我将它移出dir时(因为输入)我可以直接运行单元测试。
据说我的测试没有错误。但是当我与鼻子一起运行所有测试时出现问题:nosetests --with-coverage --cover-package=prettytable --cover-min-percentage=75
会出错:
TypeError: _() takes exactly 1 argument (0 given)
很奇怪。我的测试文件是这样的:
import unittest
from prettytable.prettytable import _char_block_width
fixtures = {
'normal': (1, u'12345qwerljk/.,WESD'),
'chs': (2, u'石室诗士施氏嗜狮誓食十狮'),
'jp': (2, u'はじめまして'),
'hangul': (2, u'우리글자언문청'),
'full_width_latin': (2, u'XYZ[\]^_xyz{|}~⦅'),
}
def _width_test_factory(width, words):
def _(self):
map(lambda x: self.assertEqual(width, _char_block_width(ord(x))),
list(words))
return _
class CharBlockWidthTest(unittest.TestCase):
pass
for name in fixtures:
test_name = 'test_%s' % name
test_func = _width_test_factory(*fixtures[name])
test_func.__name__ = test_name
print test_func
setattr(CharBlockWidthTest, test_name, test_func)
答案 0 :(得分:0)
方法_(self)
只能在类实例的上下文中执行(它将提供隐式参数self
。不是当nose导入模块并解析它们以查找测试函数时。
"鼻子"将测试函数简单地移动到CharBlockWidthTest
类中。使用setattr
动态添加到类中的三层复合函数对于测试用例发现机制而言有点过于复杂。
我认为以下代码应该是鼻子友好的等价物(未经过测试)。
class CharBlockWidthTest(unittest.TestCase):
def test_fixtures(self):
for name, val in fixtures.items():
width, words = val
for x in words:
self.assertEqual(width, _char_block_width(ord(x)),
"Error on fixture %s: word %s" % \
(name, word))