我有一个如下课程:
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__()
间接测试此验证方法?
答案 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()。