4 votes

Itérateur Nomé & Exceptions

Je suis en train d'écrire une méthode qui doit vérifier certains paramètres et, s'ils sont validés, renvoyer un IEnumerable. Par exemple.

public static IEnumerable GetEnum(int param)
{
    if (!IsValidParameter(param))
    {
        throw new Exception();
    }

    while(true)
    {
        yield return 5.0;
    }
}

Cependant, je crois que en raison de l'évaluation paresseuse, lorsque je lance mes tests unitaires avec de mauvais paramètres, mais que je n'appelle pas encore de méthodes IEnumerable, l'exception n'est pas levée.

[Test]
[ExpectedException(typeof(Exception))]
void Test()
{
    var ie = GetEnum(bad_param);
}

Je peux arranger les choses en construisant l'IEnumerable dans une autre fonction (disons Foo), puis en vérifiant les paramètres dans GetEnum et en appelant Foo, mais y a-t-il une solution sans avoir à créer de multiples fonctions ?

Amicalement, Jurgen

9voto

Marc Gravell Points 482669

En raison de la manière dont les blocs d'itérateur sont définis, vous avez actuellement besoin de deux méthodes pour y parvenir :

public static IEnumerable GetEnum(int param) {
    if (!IsValidParameter(param)) {
        throw new Exception();
    }
    return GetEnumCore(param);
}
private static IEnumerable GetEnumCore(int param) {
    while(true) {
        yield return 5.0;
    }
}

Seul le bloc d'itérateur (GetEnumCore) est différé ; GetEnum s'exécute immédiatement, effectuant vos vérifications.

2voto

Matt Hamilton Points 98268

Pourriez-vous simplement initier l'itération en utilisant l'énumérateur sous-jacent ?

[Test]
[ExpectedException(typeof(Exception))]
void Test()
{
    var ie = GetEnum(bad_param);
    var en = ie.GetEnumerator();
    en.MoveNext();
}

2voto

Darin Dimitrov Points 528142

Tant que vous ne commencez pas à énumérer, votre méthode ne sera jamais appelée. Vous pourriez essayer d'énumérer dans votre test :

var ie = GetEnum(bad_param).First();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X