mars
2012
Vous connaissez surement l’instruction “yield return” de C# ? Non ? alors je vous invites à commencer par ici : http://msdn.microsoft.com/fr-fr/library/9k7k7cf0.aspx
Maintenant petite devinette :
Soit la méthode suivante :
public static IEnumerable<string> TestMethod(string filter)
{
if (string.IsNullOrEmpty(filter))
throw new ArgumentNullException("filter");
foreach (var item in values)
{
if (item.Contains(filter))
yield return item;
}
}
private static List<string> values = new List<string>() { "item 1", "item 2", "item 3", "item 1.1", "item 1.2" };
et le test unitaire suivant :
[TestMethod]
[ExpectedException(System.ArgumentNullException)]
public void TestMethod_FilterIsNull_Test()
{
string filter = string.Empty;
Program.TestMethod(filter);
}
Quel est le résultat de ce test unitaire ?
tic, tac, tic, tac …
Ce test échoue ! La question à 10 ct, c’est pourquoi ? (J’avoue, c’est un de mes collègue qui a trouvé la réponse )
La réponse se trouve dans la MSDN cité en début d’article (ou dans ILDASM ) : Lors de l’utilisation d’une instruction “yield return”, une classe encapsulant le contenu de la méthode est générée par le compilateur. Cette classe implémente les interfaces IEnumerable et IEnumerable<T>. Le code effectif de la méthode est “déplacer” dans la méthode “MoveNext” de la nouvelle classe générée, y compris la vérification de notre argument “filter”.
L’impact de tout ça c’est que la vérification de la valeur de “filter” ne sera faite que lorsque l’on commence à énumérer les valeurs possible.
Le tests unitaires tel qu’il est écrit ne parcours jamais les résultats de la méthode TestMethod et donc ne déclenchera pas d’appel à la méthode “MoveNext” de la classe généré par le compilateur.
Archives
- juillet 2012
- mars 2012
- février 2012
- novembre 2011
- octobre 2011
- mars 2011
- novembre 2010
- octobre 2010
- septembre 2010
- août 2010
- avril 2010
- février 2010
- janvier 2010
- novembre 2009
- octobre 2009
- septembre 2009
- juin 2009
- mai 2009
- avril 2009
- mars 2009
- février 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juin 2008
- mai 2008
- avril 2008
- février 2008
- mai 2007
- avril 2007
- mars 2007
- février 2007
- janvier 2007