2017-07-16 2 views
1

Je veux tester qu'un délégué ne lance pas FooException, mais je m'en fous s'il y a quoi que ce soit d'autre. Par conséquent, je ne peux pas utiliser la contrainte Nothing.Contrainte NUnit pour un délégué qui ne lance pas une exception particulière

Le modèle de contraintes n'ont quelque chose pas comme ça:

Assert.That(del, Throws.Not.InstanceOf<FooException>()); //can't use Not like this 

Est-ce possible en quelque sorte?

+0

Avez-vous essayé d'intercepter des exceptions et de vérifier que ce n'est pas une instance de 'FooException'? Quelque chose semble lover ceci: 'Assert.IsNotInstanceOf (exc)' –

+0

@GeorgeAlexandria Ouais c'est ce que je fais, mais c'est en désordre. J'espérais qu'il y a un moyen de le faire. – grokky

Répondre

2

Ceci est légèrement awkwar d, mais devrait le faire

Assert.That(Assert.Catch(del), Is.Null.Or.Not.TypeOf<FooException>()); 

Personnellement, je préfère la version à deux lignes

var ex = Assert.Catch(del); 
Assert.That(ex, Is.Null.Or.Not.TypeOf<FooException>()); 

ou encore plus clair de trois-liner

var ex = Assert.Catch(del); 
if (ex != null) 
    Assert.That(ex, Is.Not.TypeOf<FooException>()); 

Cela fonctionne parce que ne pas faire valoir à tout est la même chose que réussir.

L'absence d'un moyen plus direct de tester cela dans la syntaxe reflète une opinion des développeurs - du moins à ce moment - que vous devriez toujours savoir quelle exception vous attendez.

+0

Merci pour toutes les différentes options! Il y a au moins un cas où vous ne pouvez pas savoir, lorsque vous testez les déclarations de garde/vérification. Je sais ce qu'il lance si les données sont mauvaises, mais pas autrement (et ne s'en soucie pas, seulement se soucient de lui répondre d'une manière particulière pour les mauvaises données). – grokky

2

On dirait que nunit ne le fournit pas dès sa sortie de l'emballage.
Mais vous avez des solutions de contournement:
Vous pouvez utiliser le cadre d'affirmation supplémentaire, comme FluentAssertions, qui vous permet de faire ensuite l'affirmation:

del.ShouldNotThrow<FooException>(); 

vous pouvez également écrire votre propre custom-constraints, comme ThrowsNothingConstraint

Ou vous pouvez simplement écrire metod personnalisé

public void AssertException<T>(Action act) where T : Exception 
{ 
    try 
    { 
     act(); 
    } 
    catch (T e) 
    { 
     Assert.Fail(); 
    } 
    catch (Exception e) 
    { 
     Assert.Pass(); 
    } 
}