Pex & Moles - инъекция зависимости - PullRequest
3 голосов
/ 07 декабря 2011

Я новичок в Пекс и Крот. Я пытаюсь запустить 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 Ответ

1 голос
/ 07 декабря 2011

Попробуйте передать тип заглушки Moles в параметризованный тест Pex.Чтобы создать параметризованный тест, щелкните правой кнопкой мыши класс, который вы хотите исследовать, и выберите PEX> Создать параметризованный модульный тест .Это создает метод в тестовом классе, который содержит аргументы.Отдельные тесты вызывают этот параметризованный тест, отправляя отдельные аргументы теста.

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

Я также предлагаю посмотреть на использование типов Mole Stub для ваших инъекций модульного теста. Справочное руководство по Microsoft Moles - отличное место для начала изучения использования Moles в модульных тестах.Тип заглушки родинок будет создан для вашего интерфейса при создании параметризованного теста.Просто настройте обходные пути для своего типа заглушки, а затем передайте его параметризованному тесту.

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

Пример перечисления:

[Flags()]
public enum MoleConfigurations
{
    MoleSqlClientObjects,
    DisableDirectory_Exists,
    DisableEventLogExtensions,
    DisableInitializeDatabaseObjects,
    DisableInitializeThreadingObjects,
    DisableQueueExistingDataFiles,
    DisableConstructor
}
...