Как использовать библиотеку Pex and Moles с Entity Framework?

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

У меня есть проект Data , который имеет очень простую модель с одна сущность ( 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:

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

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

Вопрос

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

Думаю, мне, вероятно, следует установить какой-то предел Pex, сколько элементов он должен предоставить для этого конкретного метода тестирования.

15
задан Robert Koritnik 4 October 2010 в 09:15
поделиться