UnitTesting für SharePoint Entwickler

SharePoint Developer sind … anders. Zumindest, was (Development) Know How, Lösungen und Entwicklungsumgebung angeht. So war es bislang nicht (leicht) möglich, Unit Testing für SharePoint-Code durchzuführen. Genau hier setzt ein Projekt von Microsoft an, im Visual Studio ALM and Team Foundation Server-Blog:

MSDN: Introducing SharePoint Emulators

SharePoint Emulators bietet ein System um eigenen Code im SharePoint 2010 Server Object Model zu testen. Dagegen können dann Unit-Tests durchgeführt werden. SharePoint Emulators basiert vollständig auf dem Microsoft Fakes Framework und vereinfacht die gesamte Handhabung enorm.

Die Installation führt über den NuGet Package Manager.
In Visual Studio 2012 wird das Menü Tools / Library Package Manager / Manage NuGet Packages for Solution… geöffnet und Online nach “SharePoint Emulators” gesucht. Dieses Paket einfach installieren:

20121228 (1)

Erforderlich sind Microsoft SharePoint 2010 Server (oder SharePoint 2010 Foundation) und Microsoft Visual Studio 2012 Ultimate.

Bezüglich SharePoint 2013 Support gibt es noch keine offiziellen Informationen. Es gibt jedoch einen diesbezüglichen Blogartikel SharePoint 2013 at Build - "SharePoint emulator for unit testing" von Jeremy Thake, MVP SharePoint, von November 2012 im nothingbutsharepoint.com-Blog: “The shims currently do not support SharePoint 2013 as SharePoint 2010 that is in market was the priority for the Visual Studio 2012 team…but it will do in the next release I’m told.”. Also voraussichtlich bald…

Die SharePoint Emulatoren können leicht in existierende Tests gegen die SharePoint API erfolgen. Der Code muss nur in einen umgebenden Bereich SharePointEmulationScope eingebettet werden. Um das Ganze zu visualisieren, hier ein Beispielcode aus dem Original-Artikel:

[TestMethod] public  void ScheduleAppointmentReturnsTrueWhenNewAppointmentIsCreated() { using (new SharePointEmulationScope(EmulationMode.Enabled))<br>{         SPSite site = new SPSite("https://localhost"); string listName = String.Format("List{0}", Guid.NewGuid()); // create a new temporary list Guid listId = site.RootWeb.Lists.Add listName, listName, SPListTemplateType.GenericList); SPList list = site.RootWeb.Lists[listId]; Assert.IsNotNull(list); // add fields to list list.Fields.Add("Name", SPFieldType.Text, true); list.Fields.Add("Phone", SPFieldType.Text, false); list.Fields.Add("Email", SPFieldType.Text, false); list.Fields.Add("Age", SPFieldType.Text, false); list.Fields.Add("Date", SPFieldType.Text, false); list.Update(); // prepare string errorMsg = string.Empty; DateTime date = DateTime.Now; BookAnAppointmentWebPart webPart = new BookAnAppointmentWebPart(); // act bool success = webPart.ScheduleAppointment(site.RootWeb, list.Title, "My Name", "888-888-8888", "My.Name@contoso.com", "23", date, out errorMsg); // assert Assert.IsTrue(success); // cleanup list.Delete(); site.Dispose();     } }

Der Code in SharePointEmulationScope wird automatisch zur Laufzeit von Microsoft.SharePoint.dll zu SharePoint Emulators umgeleitet.

Das Testen von Code gegen SharePoint Emulators hat einige Vorteile:
Bessere Performance, Isolation von SharePoint und letztlich reduzierte Wartung und einfacheres Handling, da nicht gegen eine ganze SharePoint Infrastruktur getestet werden muss.

Daher der Tipp für SharePoint-Entwickler: Ansehen! 20110401 (1)