Я работаю над приложением для рабочего стола 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>();
Это правильный или единственный способ сделать это? Можете ли вы предложить какой-нибудь лучший способ для моделирования поведения объекта?