Nach dem Lesen eines anderen SO-Threads (Should parameters/returns of collections be IEnumerable<T> or T[]?) bin ich der Meinung, dass ein Unit-Test "Problem" wahrscheinlich damit zu tun hat, was der Thread als "späte Bewertung" bezeichnet.IEnumerable <T> Auswertung und Komponententest
Ich übergebe drei verschiedene, aber verwandte Varianten IEnumerables von einer Presenter-Klasse an meine Benutzeroberfläche. Die beste Nachricht ist, dass es funktioniert, aber ich finde keinen Weg, einen Komponententest zu machen, der definitiv beweist, dass das richtige IEnumerable zur richtigen Zeit passiert wird.
Ich habe eine Fassade mit dem folgenden Verfahren:
public IEnumerable<DynamicDisplayDto> NonProjectDtos
{
get
{
var activities = LeaveTimeActivities.Cast<TimeSheetActivityBase>()
.Concat(AdministrativeActivities.Cast<TimeSheetActivityBase>());
return _assembler.ToActivityDtoCollection(activities, _timeSheet);
}
}
In einem Moderator, laden I ein Widget:
private ITimeSheetMatrixWidget _nonProjectActivityMatrix;
public ITimeSheetMatrixWidget NonProjectActivityMatrix {
set {
..
// load the activities
_nonProjectActivityMatrix.Load(Facade.NonProjectDtos);
...
}
}
Dann wird der Test an einer verspotteten Matrix (mit Rhino Mocks):
Wenn ich in den Debugger schaue, kann ich sehen, dass das IEnumerable laden arg Domain.TransferObjec auswertet ts.TimeSheetDtoAssembler + d__1, was auch der Teil von Rhinos Nachricht ist, dass der Methodenaufruf fehlgeschlagen ist.
Liegt dies an der späten Auswertung? Gibt es eine einigermaßen elegante Möglichkeit, dies genauer zu testen?
Ich würde auch gerne die Zwischenbewertung besser verstehen, die sehr ähnlich der Methode aussieht, die sie zusammengebaut hat (im obigen Fassadencode).
Hallo. Gute Nachrichten, schlechte Nachrichten - die Fassade wird auch gespritzt. Ich bin auf der Suche nach einem Weg, um die Vorteile der IEnumerable zu halten, aber ich kann es als ein Parameter testen, wenn ich kann. Ich habe versucht, ToList() in den Komponententestaufruf zu setzen, aber das ändert nur den Fehler in einen verständlicherer Parameter, der nicht übereinstimmt. Wo hast du das mit der ToList() gemeint? Thx – Berryl
Ich vermute, dass jemand in der Kette gibt es eine "neue" Operation, die ein anderes Element erzeugt. Anstatt viel Zeit darauf zu verwenden, sollten Sie erwägen, die Überprüfung auf keine Argumente zu belassen und sicherzustellen, dass die richtigen Elemente in der Enumeration verfügbar sind. Ist das nicht wirklich die richtige Definition hier - dass die richtigen Elemente geladen sind? – tvanfosson
Ich sehe nicht, wie ich überprüfen kann, ob die Elemente in einem Test der Schnittstelle geladen wurden. Ich habe nur Zugriff auf IEnumerable als Argument für den Methodenaufruf, soweit ich das sehen kann. Wie würdest du das machen? – Berryl