web-dev-qa-db-fra.com

Exceptions NUnit attendues

J'ai un ensemble de cas de test, dont certains devraient lever des exceptions. Pour cette raison, j'ai défini les attributs de ces tests pour attendre des exceptions comme ceci:

[ExpectedException("System.NullReferenceException")]

Quand je lance mes tests localement, tout va bien. Cependant, lorsque je déplace mes tests sur le serveur CI exécutant TeamCity, tous mes tests qui ont prévu des exceptions échouent. C'est un bug connu.

Je sais qu'il y a aussi le Assert.Throws<> et Assert.Throws méthodes proposées par NUnit.

Ma question est de savoir comment puis-je les utiliser au lieu de l'attribut que j'utilise actuellement?

J'ai jeté un coup d'œil à StackOverflow et j'ai essayé quelques choses qui ne semblent pas fonctionner pour moi.

Existe-t-il une solution simple à 1 ligne pour l'utiliser?

50
Martin

Je ne suis pas sûr que ce que vous avez essayé vous pose problème, mais vous pouvez simplement passer un lambda comme premier argument à Assert.Throws. En voici un d'un de mes tests qui réussit:

Assert.Throws<ArgumentException>(() => pointStore.Store(new[] { firstPoint }));

D'accord, cet exemple a peut-être été un peu bavard. Supposons que j'ai passé un test

[Test]
[ExpectedException("System.NullReferenceException")]
public void TestFoo()
{
    MyObject o = null;
    o.Foo();
}

qui passerait normalement parce que o.Foo() déclencherait une exception de référence nulle.

Vous devez ensuite supprimer l'attribut ExpectedException et encapsuler votre appel à o.Foo() dans un Assert.Throws.

[Test]
public void TestFoo()
{
    MyObject o = null;
    Assert.Throws<NullReferenceException>(() => o.Foo());
}

Assert.Throws "tente d'appeler un extrait de code, représenté en tant que délégué, afin de vérifier qu'il lève une exception particulière." La syntaxe () => DoSomething() Représente un lambda , essentiellement une méthode anonyme. Donc, dans ce cas, nous demandons à Assert.Throws D'exécuter l'extrait de code o.Foo().

Donc non, vous n'ajoutez pas simplement une seule ligne comme vous le faites pour un attribut; vous devez envelopper explicitement la section de votre test qui lèvera l'exception, dans un appel à Assert.Throws. Vous n'avez pas nécessairement à utiliser un lambda, mais c'est souvent le plus pratique.

89
Mark Rushakoff

Voici un exemple simple utilisant les deux façons.

string test = null;
Assert.Throws( typeof( NullReferenceException ), () => test.Substring( 0, 4 ) );
Assert.Throws<NullReferenceException>( () => test.Substring( 0, 4 ) );

Si vous ne voulez pas utiliser de lambdas.

[Test]
public void Test()
{
    Assert.Throws<NullReferenceException>( _TestBody );
}

private void _TestBody()
{
    string test = null;
    test.Substring( 0, 4 );
}
10
Jerod Houghtelling

Par défaut, TeamCity utilise NUnit 2.2.10, qui n'a pas ExpectedException. Consultez les documents TeamCity "NUnit for NAnt" pour voir comment le changer en quelque chose de plus moderne, y compris la liste spécifique des versions fournies par TeamCity.

2
Ross Patterson

NUnit a ajouté une nouvelle méthode Record.Exception.

Si vous préférez séparer les actes et les affirmations,

Acte:

ex = Record.Exception(()={throw new Exceprtion()} 

Affirmer:

Assert.NotNull(ex);
0
David