Знакомство с эмуляторами SharePoint

Группа разработчиков Visual Studio с гордостью объявляет о выпуске эмуляторов SharePoint для Visual Studio 2012. Модульное тестирование программного кода для SharePoint –– довольно трудная задача. В идеальном случае тестируемый код следует изолировать от среды SharePoint, например, с помощью платформы изоляции Microsoft Fakes. К сожалению, отзывы специалистов, опробовавших этот подход на практике, сводятся к следующему: создание и поддержка макетов и тестовых заполнителей для среды SharePoint отнимают много времени и сил. К счастью, группа разработчиков эмуляторов SharePoint взялась за решение этой непростой задачи. Эмуляторы SharePoint –– это система макетов на основе оболочек совместимости, реализующих основные режимы работы объектной модели сервера SharePoint 2010.

Системные требования

· Microsoft SharePoint 2010 Server (SharePoint 2010 Server or SharePoint 2010 Foundation)

· Microsoft Visual Studio 2012 Ultimate

Получение эмуляторов SharePoint

Эмуляторы SharePoint можно скачать на сайте, где публикуются пакеты NuGet. Выполните поиск по официальному сайту публикации пакетов NuGet, введя запрос «SharePoint Emulators».

clip_image001

Использование эмуляторов SharePoint

Эмуляторы SharePoint легко и просто использовать одновременно с существующими тестами. Тесты на основе эмуляторов SharePoint можно разрабатывать при помощи API SharePoint, для  этого потребуется только оболочка SharePointEmulationScope.

[TestMethod]
public void ScheduleAppointmentReturnsTrueWhenNewAppointmentIsCreated()
{
using (new SharePointEmulationScope(EmulationMode.Enabled))
{
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();
}
}

Весь код, запускаемый из оболочки SharePointEmulationScope, будет автоматически перенаправлен в среду выполнения. Все вызовы к сборке Microsoft.SharePoint.dll автоматически перенаправляются в эмулятор SharePoint.

Создание расширений для эмуляторов SharePoint

Масштабность и сложность API SharePoint заставили нас сосредоточиться на наиболее часто используемых типах и методах. Если поддержка типа не реализована, то для успешного запуска теста нужно будет выполнить дополнительные действия. В качестве примера приведем тест, который завершается сбоем и возвратом еще не реализованного исключения.

[TestMethod]
public void GetAppointmentsForTodayReturnsTwoAppointments()
{
using (var emulationScope = new SharePointEmulationScope(EmulationMode.Enabled))
{
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();

 

        DateTime date = DateTime.Now;
BookAnAppointmentWebPart webPart = new BookAnAppointmentWebPart();

 

        // insert 3 item into list
SPItem item = list.Items.Add();
item["Name"] = "My Name";
item["Phone"] = "888-888-8888";
item["Email"] = "My.Name@contoso.com";
item["Age"] = "23";
item["Date"] = date.ToString("D");
item.Update();

 

        SPItem item2 = list.Items.Add();
item2["Name"] = "His Name";
item2["Phone"] = "777-777-7777";
item2["Email"] = "His.Name@contoso.com";
item2["Age"] = "25";
item2["Date"] = date.AddDays(1).ToString("D");
item2.Update();

 

        // Act
string result = webPart.GetAppointmentsForToday(list.Title, site.RootWeb);

 

        // Assert
Assert.IsTrue(result.Contains(String.Format("Name: My Name, Phone: 888-888-8888,
Email: My.Name@contoso.com, Age: 23, Date: {0}", date.ToString("D"))));
Assert.IsFalse(result.Contains("Name: His Name"));

 

        // cleanup
list.Delete();
site.Dispose();
}
}

 clip_image003

Если будет выявлен сценарий, обработка которого приводит к сбою теста, то оптимальный выход в этом случае — расширить возможности эмулятора, реализовав новый режим работы. Для правильной работы эмуляторов SharePoint требуется платформа оболочек совместимости Microsoft Fakes. Эмуляторы — это набор конкретных вариантов реализации данных оболочек. Если будет вызвана отсутствующая оболочка совместимости, необходимо реализовать ее. Подробные сведения о нужной оболочке совместимости приведены в сообщении об ошибке, в данном примере оно имеет вид SPList.GetItems(SPQuery).

if (emulationScope.EmulationMode == EmulationMode.Enabled)
{
var sList = new ShimSPList(list);
sList.GetItemsSPQuery = (query) =>
{
var shim = new ShimSPListItemCollection();
shim.Bind(new[] { list.Items[0] });
return shim.Instance;
};
}

Если данный программный код добавить к предыдущему примеру, то указанный в нем тест завершится успешно. Данную методику можно использовать для реализации неподдерживаемых режимов работы и  настройки эмуляторов в соответствии со средой выполнения.

Запуск тестов для различных эмуляторов

Одновременный запуск тестов для нескольких эмуляторов обеспечивает следующие преимущества: повышение производительности, изоляцию от SharePoint и снижение требований к обслуживанию тестовой инфраструктуры SharePoint. Однако иногда тесты выполняются на реальном сервере SharePoint. Эмуляторы SharePoint позволяют повторно запускать код тестов в контексте другой среды.

SharePointEmulationScope принимает в качестве параметра дополнительный перечисляемый тип EmulationMode. Включенный по умолчанию режим работы предусматривает перехват всех вызовов к библиотеке Microsoft.SharePoint.dll в реальном времени. Второе значение транзитного параметра позволяет вызовам обращаться напрямую к оригинальной сборке в обход любых оболочек совместимости. С помощью значения перечисляемого типа можно управлять контекстом запуска тестов.

Существует множество способов получить значение параметра EmulationMode и контролировать его. Чтобы контролировать режим эмуляции, разработчики эмулятора SharePoint обычно применяют управляемые данными тесты. Разработчики подготовили тесты, использующие возможности эмуляторов SharePoint для тестирования сервера SharePoint в конфигурации по умолчанию. Мы применяем данные тесты и данный подход, чтобы проверять режимы работы эмуляторов SharePoint. Существует множество альтернативных вариантов их использования: написание программного кода настройки и инициализации, составление директив препроцессора и т. п.

Ресурсы