Es gibt ein DI-Muster namens "Ambient Context", das Sie dazu verwenden können.
Sie können damit vermeiden, die ganze Zeit übergreifende Bedenken zu äußern, aber es ermöglicht Ihnen immer noch, Unit-Test-Dinge.
Das bekannteste Beispiel ist ein Datetime-Anbieter:
public abstract class TimeProvider {
private static TimeProvider current =
DefaultTimeProvider.Instance;
public static TimeProvider Current {
get { return TimeProvider.current; }
set {
if (value == null) {
throw new ArgumentNullException("value");
}
TimeProvider.current = value;
}
}
public abstract DateTime UtcNow { get; }
public static void ResetToDefault() {
TimeProvider.current = DefaultTimeProvider.Instance;
}
}
Wo eine Implementierung könnte wie folgt aussehen:
public class DefaultTimeProvider : TimeProvider {
private readonly static DefaultTimeProvider instance =
new DefaultTimeProvider();
private DefaultTimeProvider() { }
public override DateTime UtcNow {
get { return DateTime.UtcNow; }
}
public static DefaultTimeProvider Instance {
get { return DefaultTimeProvider.instance; }
}
}
-Code TimeProvider.Current
verwenden würde als die Datetime eher für den Zugriff auf DateTime
direkt verwenden.
Die standardmäßige konkrete Implementierung gibt das übliche DateTime.UtcNow zurück. Für den Komponententest können Sie jedoch eine spezielle Testimplementierung verwenden und TimeProvider.Current
darauf setzen, bevor Sie die Komponententests ausführen.
See this page (where that code comes from) for more information.
Beachten Sie, dass Sie nur dieses Muster für eine wirklich übergreifende Anliegen wie Datum- und Sicherheit, Protokollierung und so weiter verwendet werden soll.
Während des Testvorgangs, ich ordne Benutzer Feld zu einem gefälschten Repository – Pharaz