Pex & Moles - инъекция зависимости
Я новичок в Пекс и Крот. Я пытаюсь запустить Pex в моем коде, но я использую конструктор инъекций. Есть ли способ проинструктировать Пекса о том, как вводить конструкторы?
редактировать
public UserLogic(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public int GetUsersAge(int id)
{
User user = _userRepository.GetById(id);
DateTime DOB = user.DOB;
DateTime now = DateTime.Today;
int age = now.Year - DOB.Year;
if (DOB > now.AddYears(-age)) age--;
return age;
}
Мне нужно вставить заглушку userRepository. Pex завершается с ошибкой NullReferenceException при вызове _userRepository.GetById(id). Я использую Moq для своих юнит-тестов, но хочу перейти на pex и кроты
Должен ли я использовать PexFactories для создания моих заглушек?
1 ответ
Попробуйте передать тип Moles Stub в параметризованный тест Pex. Чтобы создать параметризованный тест, щелкните правой кнопкой мыши класс, который вы хотите исследовать, и выберите PEX > Создать параметризованный модульный тест. Это создает метод в тестовом классе, который содержит аргументы. Отдельные тесты вызывают этот параметризованный тест, отправляя отдельные тестовые аргументы.
Когда тестируемый код использует внедрение зависимостей посредством аргументов (он имеет аргумент, типизированный интерфейсом), сгенерированный Pex метод параметризованного теста также будет содержать тот же аргумент типа интерфейса. Вы можете написать свои собственные методы тестирования, которые также вызывают параметризованный метод, передавая ему свои собственные значения, включая тип интерфейса. Только не записывайте их в сгенерированный Pex файл!
Я также предлагаю рассмотреть возможность использования типов Mole Stub для инъекций ваших юнит-тестов. Справочное руководство по Microsoft Moles - отличное место для начала изучения использования Moles в модульных тестах. Тип заглушки родинок будет создан для вашего интерфейса при создании параметризованного теста. Просто настройте обходные пути для своего типа заглушки, а затем передайте его параметризованному тесту.
Создание обходных путей очень просто. Я предлагаю создать метод конфигурации в тестовом проекте, который настраивает часто используемые обходные пути. Я обычно добавляю флаг перечисления в качестве аргумента к этому методу, чтобы я мог легко сказать, какие обходные пути создавать для определенных типов, все в одном вызове.
Образец перечисления:
[Flags()]
public enum MoleConfigurations
{
MoleSqlClientObjects,
DisableDirectory_Exists,
DisableEventLogExtensions,
DisableInitializeDatabaseObjects,
DisableInitializeThreadingObjects,
DisableQueueExistingDataFiles,
DisableConstructor
}