Как макетировать объекты в приложении C # Windows для интеграционного тестирования? - PullRequest
0 голосов
/ 24 апреля 2019

Я работаю над приложением для рабочего стола Windows в C #. Приложение использует веб-API для получения некоторых данных и взаимодействует с некоторыми встроенными устройствами через USB. Я использовал шаблон MVVM с фреймворком Caliburn.micro. Я также включил внедрение зависимостей с использованием простого контейнера из Caliburn.micro.

Я хотел бы предоставить заглушки для клиента Web API, а также для USB-устройств во время разработки. Причина заглушки клиента API заключается в том, что API еще не завершен, и я не хочу зависеть от него. Тем не менее, я знаю запланированные конечные точки и ожидаемые ответы от API. Точно так же у меня нет доступных USB-устройств, но я знаю протокол, используемый для связи с ними. Моя идея состоит в том, чтобы предоставить заглушки для этих классов, представляющих API, устройство и завершить другие части приложения. Позже я могу заменить заглушки реальными классами.

Глядя на различные фреймворки для насмешливых объектов (moq, autofaq, Rhino.mocks), я теряюсь в том, как их использовать. Большинство или все примеры, которые я обнаружил об их использовании, говорят о том, что при юнит-тестировании имитируют объекты, а не сам код. Я хотел бы фактически смоделировать поведение объекта и полностью протестировать приложение, а не тестировать отдельные функции.

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


    public class Bootstrapper : BootstrapperBase
    {

        private SimpleContainer _container = new SimpleContainer();

        public Bootstrapper()
        {
            Initialize();
        }

        protected override void Configure()
        {

            _container.Instance(_container);
            _container
                .Singleton<IWindowManager, WindowManager>()
                .Singleton<IEventAggregator, EventAggregator>()
                .Singleton<IAPIHelper, APIHelper>();


            _container
                .PerRequest<IDevice, SprintProDevice>();

            GetType().Assembly.GetTypes()
                .Where(type => type.IsClass)
                .Where(type => type.Name.EndsWith("ViewModel"))
                .ToList()
                .ForEach(viewModelType => _container.RegisterPerRequest(
                    viewModelType, viewModelType.ToString(), viewModelType));

        }
}


APIHelper - это класс, который будет действовать как клиент для взаимодействия с Web API. Поэтому в моем случае я могу создать еще один класс APIHelper и использовать его, как показано ниже.

    _container.Singleton<IAPIHelper, DummyAPIHelper>();

Это правильный или единственный способ сделать это? Можете ли вы предложить какой-нибудь лучший способ для моделирования поведения объекта?

...