如何测试该类__init__方法在pytest中引发异常(Python)

如何测试该类__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

+1

我只想指出一个“必须拥有”参数应该可能是位置参数,而不是关键字参数。 Kwargs几乎总是可选的(并设置为合理/理智的默认值)。 – bnaecker

+2

在这种测试中,如果没有'must_have_parameter'就不能实例化类,我认为你不需要使用fixture。你最后一个例子_'with pytest.raises(ValueError,message =“must_have_parameter must be set。”):bad_instance = MyClass()'_是正确的方法。 – aneroid

在这种情况下我看不到任何好处。我只是在测试方法中创建对象。

拥有一个带有默认值的可选参数,然后在参数丢失时引发异常似乎很奇怪。除非您确实需要自定义错误消息,否则请考虑删除默认值。