Как использовать библиотеку "Pex and Moles" с Entity Framework? - PullRequest
15 голосов
/ 22 сентября 2010

Это сложный вопрос , потому что не так уж много людей используют Pex & Moles или, как мне кажется (хотя Pex действительно отличный продукт - намного лучше, чем любой другой инструмент для модульного тестирования)

У меня есть проект Данные , который имеет очень простую модель с одной сущностью (DBItem). Я также написал DBRepository в этом проекте, который манипулирует этой моделью EF. В репозитории есть метод с именем GetItems(), который возвращает список элементов бизнес-уровня (BLItem) и выглядит примерно так (упрощенный пример):

public IList<BLItem> GetItems()
{
    using (var ctx = new EFContext("name=MyWebConfigConnectionName"))
    {
        DateTime limit = DateTime.Today.AddDays(-10);
        IList<DBItem> result = ctx.Items.Where(i => i.Changed > limit).ToList();
        return result.ConvertAll(i => i.ToBusinessObject());
    }
}

Так что теперь я хотел бы создать несколько модульных тестов для этого конкретного метода. Я использую Pex & Moles . Я создал мои родинки и заглушки для контекста моего объекта EF.

Я хотел бы написать параметризованный модульный тест (я знаю, что впервые написал свой рабочий код, но мне пришлось, так как я тестирую Pex & Moles), который проверяет, что этот метод возвращает действительный список элементов.

Это мой тестовый класс:

[PexClass]
public class RepoTest
{
    [PexMethod]
    public void GetItemsTest(ObjectSet<DBItem> items)
    {
        MEFContext.ConstructorString = (@this, name) => {
             var mole = new SEFContext();
        };

        DBRepository repo = new DBRepository();
        IList<BLItem> result = repo.GetItems();

        IList<DBItem> manual = items.Where(i => i.Changed > DateTime.Today.AddDays(-10));

        if (result.Count != manual.Count)
        {
            throw new Exception();
        }
    }
}

Затем я запускаю Pex Explorations для этого конкретного параметризованного модульного теста, но получаю ошибку Превышены границы пути . Pex начинает этот тест, предоставляя null этому методу тестирования (так items = null). Это код, который запускает Pex:

[Test]
[PexGeneratedBy(typeof(RepoTest))]
[Ignore("the test state was: path bounds exceeded")]
public void DBRepository_GetTasks22301()
{
    this.GetItemsTest((ObjectSet<DBItem>)null);
}

Это был дополнительный комментарий от Pex:

Тестовый пример слишком длинный для этих входных данных, и Пекс прекратил анализ. Обратите внимание: метод Oblivious.Data.Test.Repositories.TaskRepositoryTest.b__0 был вызван 50 раз; пожалуйста, убедитесь, что код не застрял в бесконечном цикле или рекурсии. В противном случае нажмите «Установить MaxStack = 200» и снова запустите Pex.

Обновить атрибут [PexMethod (MaxStack = 200)]

Вопрос

Я делаю это правильно или нет? Должен ли я использовать заглушку EFContext вместо? Нужно ли добавлять дополнительные атрибуты в метод теста, чтобы Moles host работал (я не уверен, что сейчас). Я бегу только Pex & Moles. Нет теста VS или nUnit или чего-либо еще.

Полагаю, мне следовало бы установить какое-то ограничение на Пекс, сколько предметов он должен предоставить для этого конкретного метода тестирования.

Ответы [ 3 ]

5 голосов
/ 12 ноября 2010

Moles не предназначен для тестирования частей вашего приложения, которые имеют внешние зависимости (например, доступ к файлам, доступ к сети, доступ к базе данных и т. Д.).Вместо этого, Moles позволяет вам смоделировать эти части вашего приложения, чтобы вы могли проводить истинное модульное тестирование на частях, которые не имеют внешних зависимостей.

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

0 голосов
/ 06 ноября 2010

Вы должны использовать шаблон репозитория Entity Framework: http://www.codeproject.com/KB/database/ImplRepositoryPatternEF.aspx

0 голосов
/ 04 октября 2010

Я только начинаю разбираться с pex также ... мои проблемы окружили меня желанием использовать его с moq;)

в любом случае ...

У меня есть некоторые методы, аналогичные вашимс той же проблемой.Когда я увеличил максимум, они ушли.Предположительно pex был удовлетворен тем, что он достаточно исследовал ветви.У меня есть методы, в которых мне также пришлось увеличить тайм-аут при проверке контракта кода.

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

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

Я использую pex в своей бизнес-логике и объектах.

Если бы я попытался проверить свой код DAL, то идентификатор должениспользуйте IOC, чтобы передать текст данных в методы, что сделало бы возможным тестирование, поскольку вы можете смоделировать контекст данных.

...