单元测试初始化​​期间调用的方法?

时间:2009-10-18 07:03:14

标签: python unit-testing oop testing

我有一个如下课程:

class Positive(object):
    def __init__(self, item):
        self._validate_item(item)
        self.item = item

    def _validate_item(self, item):
        if item <= 0:
            raise ValueError("item should be positive.")

我想为_validate_item()编写一个单元测试,如下所示:

class PositiveTests(unittest.TestCase):
    def test_validate_item_error(self):
        self.assertRaises(
            ValueError,
            Positive._validate_item,
            0
        )

不幸的是,这不起作用,因为单元测试只将0传递给方法,而不是类实例(对于self参数)和0。除此之外还有任何解决方案吗?通过类的__init__()间接测试此验证方法?

3 个答案:

答案 0 :(得分:7)

如果你没有在方法体中使用self,那么暗示它可能不需要是类成员。您可以将_validate_item函数移动到模块范围:

def _validate_item(item):
    if item <= 0:
        raise ValueError("item should be positive.")

或者如果真的必须留在课堂上,则将方法标记为静态:

class Positive(object):
    def __init__(self, item):
        self._validate_item(item)
        self.item = item

    @staticmethod
    def _validate_item(item):
        if item <= 0:
            raise ValueError("item should be positive.")

然后,您的测试应按照书面形式进行。

答案 1 :(得分:1)

您不是在创建Positive的实例。 <怎么样

Positive()._validate_item, 0

答案 2 :(得分:1)

嗯,_validate_item()是通过构造函数测试的。使用null或Negative值调用它将引发ValueError异常。

退后一步,这是不是的目标? “要求”是不应使用零值或负值创建对象。

现在这是一个人为的例子,所以上述内容不适用于真正的班级;另一种可能性,真正有一个专门用于_validate_item()方法的测试,可能是创建一个具有正值的对象,然后在其上调用validate_item()。