2010-09-13 5 views
6

Je vois un motif dans mon code où l'expression lambda n'est pas couverte par la couverture de code, le débogueur DOES passe par le code et il n'y a pas de blocs conditionnels.Couverture de code sur les expressions Lambda

public CollectionModel() 
{ 
    List<Language> languages = LanguageService.GetLanguages(); 
    this.LanguageListItems = 
     languages.Select(
      s => 
      new SelectListItem { Text = s.Name, Value = s.LanguageCode, Selected = false }). // <-- this shows as not covered 
      AsEnumerable(); 
} 

C'est un peu étrange. Des idées?

Répondre

5

Ce que je pense que vous voulez dire est que le débogueur ne franchit pas la ligne indiquée; Est-ce correct?

Si c'est votre question, alors la réponse est que, au moins dans ce cas particulier, ce que vous voyez est exécution différée. Toutes les méthodes d'extension LINQ fournies par System.Linq.Enumerable présentent ce comportement: à savoir, le code à l'intérieur de l'instruction lambda elle-même est et non exécuté sur la ligne où vous le définissez. Le code est seulement exécuté une fois que l'objet résultant est énuméré.

Ajouter ce sous le code que vous avez posté:

foreach (var x in this.LanguageListItems) 
{ 
    var local = x; 
} 

Ici, vous verrez le saut de débogage à votre lambda.

+0

+1. Alternativement, il utilise couramment ToList au lieu de AsEnumerable et a le même effet. – Niki

+1

@nikie: Oui, mais je voulais qu'il voit spécifiquement le débogueur revenir à la lambda à l'itération car je pense que cela rend clairement clair ce qui se passe. –

+2

Notez également que si la collection est vide, la projection ne sera jamais appelée même si la collection est itérée. –