Это непросто, потому что не так уж много людей используют 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 какое-то ограничение на количество элементов, которые он должен предоставить для этого конкретного метода тестирования.