ti-enxame.com

Use o método NUnit Assert.Throws ou o atributo ExpectedException?

Eu descobri que estas parecem ser as duas principais formas de testar exceções:

Assert.Throws<Exception>(()=>MethodThatThrows());

[ExpectedException(typeof(Exception))]

Qual destes seria o melhor? Alguém oferece vantagens sobre o outro? Ou é simplesmente uma questão de preferência pessoal? 

133
SamuelDavis

O primeiro permite testar mais de uma exceção, com várias chamadas:

Assert.Throws(()=>MethodThatThrows());
Assert.Throws(()=>Method2ThatThrows());

O segundo só permite testar uma exceção por função de teste.

81
chue x

A principal diferença é:

O atributo ExpectedException() faz o teste ser aprovado se ocorrer uma exceção em any place no método de teste.
O uso de Assert.Throws() permite especificar exact lugar do código onde a exceção é esperada.

O NUnit 3.0 descarta o suporte oficial para ExpectedException no total.

Então, eu definitivamente prefiro usar o método Assert.Throws() ao invés do atributo ExpectedException().

241
Alexander Stepaniuk

Eu prefiro assert.throws, uma vez que me permite verificar e afirmar outras condições após a exceção ser lançada.

    [Test]
    [Category("Slow")]
    public void IsValidLogFileName_nullFileName_ThrowsExcpetion()
    {
        // the exception we expect thrown from the IsValidFileName method
        var ex = Assert.Throws<ArgumentNullException>(() => a.IsValidLogFileName(""));

        // now we can test the exception itself
        Assert.That(ex.Message == "Blah");

    }
33
Mike Parkhill

Você também pode digitar o erro que está esperando (como a versão antiga do atributo).

Assert.Throws<System.InvalidOperationException>(() => breakingAction())
9
Reverend Sfinks

Se você estiver usando uma versão mais antiga (<= 2.0) de NUnit, será necessário usar ExpectedException

Se você estiver usando 2.5 ou versão posterior, então você pode usar Assert.Throw()

https://github.com/nunit/docs/wiki/Breaking-Changes

Como usar: https://www.nunit.org/index.php?p=exceptionAsserts&r=2.5

0
Gireesh k