Unit-тесты для SharePoint

Снова о unit-tests?


Да, я уже рассказывал о том, как “правильно” писать юнит-тесты для SharePoint, однако сегодня наткнулся на одну интересную разработку, речь о которой пойдёт далее.

В состав Pex входит инструментарий для создания stub-объектов под названием Mole, он умеет работать с закрытыми для наследования объектами, на коих строится объектная модель SharePoint.

Если вы не знаете что такое Pex

В компании Microsoft есть подразделение, занимающееся научными разработками, называется оно Microsoft Research, подробнее узнать о том, чем же занимается это подразделение можно узнать здесь: http://research.microsoft.com/en-us/research/default.aspx

Одно из разработок данного подразделения – средство white-box тестирования для .NET под названием Pex. Разработка доступна для скачивания: http://research.microsoft.com/en-us/downloads/d2279651-851f-4d7a-bf05-16fd7eb26559/.

Конечно же концептуально Pex противоречит некоторым аспектам юнит-тестирования, т.к. проверяет как написан код, а не что он должен делать.

Насколько известно для SharePoint удобно писать лишь интеграционные тесты, которые помогут вам убедится, в том, что решение благополучно “прилунилось” и проверить, что вся необходимая логика исполняется на “живых” объектах SharePoint.

Однако во многих случаях хочется избавиться от всех инфраструктурных накладок интеграционного тестирования (производительность: я не хочу уходить пить кофе каждый раз при запуске тестов, обновление данных и проч.) и проводить полноценное модуль тестирование в изолированной среде, что обычно и позволяют делать многочисленные фреймворки для создания “тестовых двойников”, примеры для .NET:

Список может продолжить Mole, однако это научная разработка, имеющая вполне своеобразный синтаксис и подход.

Пример работы с Mole

Предположим нам необходимо протестировать некоторый участок кода:

public void UpdateTitle(SPItemEventProperties properties) {
    using (SPWeb web = new SPSite(properties.WebUrl).OpenWeb()) {
        SPList list = web.Lists[properties.ListId];
        SPListItem item = list.GetItemById(properties.ListItemId);
        item["Title"] = item["ContentType"];
        item.SystemUpdate(false);
    }
}

Для этого нам необходимо будет произвести ряд действий для генерации тестового проекта, которые я опущу (они подробно описаны в литературе на которую я ссылаюсь). Больше всего интересует код, который будет заниматься э(mole)яцией типов SharePoint:

string url = "http://foo";
// с помощью рефикса MS мы подскажем исполняющей среде, что данный тип э(mole)ирует // SPItemEventProperties и что по вызову свойства WebUrl
// (заметьте что Get свойства опять же опрделен специфичностью синтаксиса) необходимо // будет вернуть заданную нами строку
var properties = new MSPItemEventProperties {
    WebUrlGet = () => url
};

Аналогично и для остальных объектов:

MSPSite.ConstructorString = (site, _url) => {
    new MSPSite(site);
};

new MSPSite(site) {
    OpenWeb = () => new MSPWeb()
};

Так будет выглядеть пример Assert’ов

ListsGet = () => new MSPListCollection {
    ItemGetGuid = id => {
        Assert.IsTrue(listId == id);
        return new MSPList();
    }
}

Думаю данных примеров будет достаточно, для того, чтобы понять, что достойной альтернативы TypeMock Isolator пока нет, однако, с точки зрения сравнения подходов к решению проблемы с промышленной и академической стороны Mole очень интересен.

Материалы

Статья об использовании Mole: http://research.microsoft.com/en-us/projects/stubs/stubstutorial.pdf

Статья о тестировании SharePoint с помощью Mole и Pex: http://research.microsoft.com/en-us/projects/pex/pexsharepoint.pdf

Advertisements

2 комментария on “Unit-тесты для SharePoint”

  1. ulu:

    Кстати, у TypeMock есть специальная версия Isolator for Sharepoint.


Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s