2010-09-13 7 views
6

Ich sehe ein Muster in meinem Code, wo der Lambda-Ausdruck als nicht abgedeckt in Code Coverage angezeigt wird, der Debugger Schritt durch den Code und es gibt keine bedingten Blöcke.Code Coverage auf Lambda Expressions

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(); 
} 

Es ist etwas merkwürdig. Irgendwelche Ideen?

Antwort

5

Was ich meine, dass Sie meinen, ist, dass der Debugger nicht über die angezeigte Linie hinausgeht; ist das richtig?

Wenn das Ihre Frage ist, ist die Antwort, dass zumindest in diesem speziellen Fall, was Sie sehen, ist verzögerte Ausführung. Alle LINQ-Erweiterungsmethoden, die von System.Linq.Enumerable bereitgestellt werden, zeigen dieses Verhalten: der Code innerhalb der Lambda-Anweisung selbst ist nicht ausgeführt in der Zeile, in der Sie es definieren. Der Code wird nur ausgeführt, sobald das resultierende Objekt überzählig ist.

Fügen Sie diese unter dem Code, den Sie geschrieben haben:

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

Hier finden Sie den Debugger Sprung zurück zu Ihrem Lambda sehen.

+0

+1. Alternativ kann er 'ToList' anstelle von' AsEnumerable' verwenden und den gleichen Effekt haben. – Niki

+1

@nikie: Ja, aber ich wollte, dass er speziell sieht, wie der Debugger bei der Iteration auf das Lambda zurückspringt, da ich das Gefühl habe, dass es unmissverständlich klar macht, was vor sich geht. –

+2

Beachten Sie auch, dass die Projektion nie aufgerufen wird, wenn die Sammlung leer ist, selbst wenn die Sammlung iteriert wird. –