我刚刚为项目PTable(PreetyTable)添加了一个单元测试,该测试直接工作但是没有鼻子

时间:2015-06-12 06:23:16

标签: python unit-testing nosetests

项目来源在这里: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)

1 个答案:

答案 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))