Как использовать библиотеку «PEX и MOLES» с структурой Entity?

StackOverflow https://stackoverflow.com/questions/3764922

Вопрос

Это сложный вопрос Потому что не слишком много людей используют Pex & Molles или так, думаю (даже если 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 & Molles.. Отказ Я создал свои родинки и заглушки для моего контекста объекта EF.

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

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

[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:

Тестовый корпус слишком длинный для этих входов, и PEX остановил анализ. Пожалуйста, обратите внимание: метод непосредственно.data.test.Repositories.taskreposityTest.b__0 назывался 50 раз; Пожалуйста, проверьте, что код не застрял в бесконечной петле или рекурсии. В противном случае нажмите «Установить MaxStack = 200» и снова запустите PEX.

Атрибут обновления [PEXMethod (MaxStack = 200)

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

Вы должны использовать рисунок репозитория структуры сущности: http://www.codeproject.com/kb/database/implrepositypatternef.aspx.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top