Erstellen oder Abrufen einer bestimmten SPTimeZone-Instanz

74

Was ist der bequemste Weg, um eine bestimmte Instanz Microsoft.SharePoint.SPTimeZonewie die folgende zu erstellen :

SPTimeZone utc = SPRegionalSettings.GlobalTimeZones
                                   .OfType<SPTimeZone>()
                                   .FirstOrDefault(tz => tz.Information.Bias == 0
                                                   && tz.Information.DaylightBias == 0);

Ist dieser Hack der beste, den ich bekommen kann ...

Dies ist insbesondere für mich ein Problem, da ich diesen Teil des Codes für Unit-Tests verspotten und zwingen möchte, immer UTC zurückzugeben. Die Eigenschaft GlobalTimeZonesscheint von HttpContext.Currentoder einer tatsächlichen Anfrage abzuhängen - eine Voraussetzung, die ich in meinen Unit Tests nicht habe ...

NB: Ich weiß, dass es System.TimeZoneInfonur eine Versammlung von Drittanbietern gibt, die mich dazu zwingt, SPTimeZone zu verwenden ...

Markus
quelle
Warum möchten Sie eine Instanz erstellen? SPTimeZonesoll die Zeitzone der Site sein, nicht als generische Zeitzonenklasse. Einstellungen gibt Ihnen die Liste der verfügbaren, dh installierten Zeitzonen und wird wahrscheinlich aus den Einstellungen in der Datenbank geladen. Das Fehlen eines Konstruktors hat einen Grund - Sie sollten dies nicht selbst erstellen. SPWeb.RegionalSettings.TimeZone
Übergeben Sie
Sie sind genau dort - ich verarbeite jedoch Daten, die in einem erhöhten Kontext abgerufen wurden und sich daher in der Zeitzone des Benutzers befinden, der zum Abrufen verwendet wurde. Diese Informationen werden im laufenden Betrieb mit Suchergebnissen zusammengeführt, die in UTC gespeichert sind. Ich habe also eine Ergebnismenge mit verschiedenen Zeitzonen - der Höhenkontext ermöglicht es mir jedoch, eine Zeitzone zu übergeben. Für mich wäre dies der einfachste Weg, um alle Daten in UTC abzurufen, und dann kann ich sie in die Zeitzone des Webs (oder des Benutzers) konvertieren, in der ich sie anzeigen möchte ...
Markus
@Markus i belive Sie msfakes außer Kraft setzen können SPRegionalSettings.GlobalTimeZonesVerhalten und dann wieder IEnumarablevon SPTimeZone. Ich habe keinen Sharepoint-Server, um es zu überprüfen ....
Old Fox
2
@ Markus Ich glaube, Sie können das SPTimeZoneso stubben , dass Sie eine bestimmte Zeitzone haben. Übrigens , wenn Geld kein Thema ist, biete ich Ihnen an, TypeMock Isolator zu verwenden, und dann können Sie fast alles tun ...
Old Fox
9
Wenn Sie beim Unit-Test Ihres Codes auf Probleme mit einer Abhängigkeit wie dieser SPTimeZone stoßen, sollten Sie einen Adapter dafür einführen und eine gefälschte Implementierung erstellen, die Sie in Ihrem Test verwenden.
Perücke

Antworten:

5

Um die Diskussion zu beenden, habe ich beschlossen, diese Frage endlich selbst zu beantworten.

In den Kommentaren gibt es einige wirklich hilfreiche Lösungen, die ich in dieser kurzen Antwort zusammenfassen möchte:

  • Einführung einer Fassade / eines Adapters
  • MS Fakes oder andere Frameworks zu
    • gefälschter Zugriff auf SPTimeZone
    • Erstellen Sie einen gefälschten HttpContext
  • Gehen Sie mit dem in der obigen Frage beschriebenen Hack ...

Ich für meinen Teil habe mich entschieden, mit MSFakes den gesamten Anruf eines Drittanbieters zu shimen (da ich sein Verhalten sowieso nicht testen wollte) und alle Eigenschaften von SPTimeZone zu shimen, die ich in meiner Methode verwende. Die Einführung eines Adapters war für mich leider keine Option, da ich die (interne) API beibehalten musste.

Markus
quelle