如何测试该类__init__方法在pytest中引发异常(Python)
问题描述:
我想用pytest(单元测试)获得更多技巧。如何测试该类__init__方法在pytest中引发异常(Python)
我尝试测试在没有必须参数的情况下实例化类时是否引发异常。
我试图创建一个夹具,但这导致了一个问题,即夹具被调用时,它会尝试在缺少参数的情况下在其中创建类,并在pytest之前引发异常,实际上断言异常被引发。
我设法克服这个不使用夹具,只是在测试函数内实例化类,但我不知道是否有一个更优雅的使用夹具的方式。
class MyClass(object):
def __init__(self, must_have_parameter=None):
if not must_have_parameter:
raise ValueError("must_have_parameter must be set.")
当尝试使用此夹具在测试我自然会得到一个错误:
实例类。
@pytest.fixture()
def bad_class_instantiation():
_bad_instance = MyClass()
return _bad_instance
然后有一个测试:
def test_bad_instantiation(bad_class_instantiation):
with pytest.raises(ValueError, message="must_have_parameter must be set."):
bad_class_instantiation()
这个测试的类被测试用例运行之前(也就是我的解释)实例失败? 它仍然表明,一个ValueError发生并得到显示自定义的短信..
如果我改变测试用例:
def test_bad_instantiation():
with pytest.raises(ValueError, message="must_have_parameter must be set."):
bad_instance = MyClass()
,则测试通过。
有没有使用夹具的方法,或者我应该在测试函数内部调用类并称它为一天?
谢谢你的时间。
Tomasz
答
在这种情况下我看不到任何好处。我只是在测试方法中创建对象。
拥有一个带有默认值的可选参数,然后在参数丢失时引发异常似乎很奇怪。除非您确实需要自定义错误消息,否则请考虑删除默认值。
我只想指出一个“必须拥有”参数应该可能是位置参数,而不是关键字参数。 Kwargs几乎总是可选的(并设置为合理/理智的默认值)。 – bnaecker
在这种测试中,如果没有'must_have_parameter'就不能实例化类,我认为你不需要使用fixture。你最后一个例子_'with pytest.raises(ValueError,message =“must_have_parameter must be set。”):bad_instance = MyClass()'_是正确的方法。 – aneroid