2015-01-23 3 views
1

Я пытаюсь понять, как я могу издеваться над IRedisClientsManager, чтобы я мог тестировать метод Handle ниже с помощью Moq.Как выполнить модульный тест Сервисные стеки Redis Client с Moq

Приветствия

public class PropertyCommandHandler : ICommandHandlerFor<PropertySaveRequest, PropertyCommandResult> 
{ 
    private readonly IRedisClientsManager _manager; 

    public PropertyCommandHandler(IRedisClientsManager manager) 
    { 
     this._manager = manager; 
    } 

    public PropertyCommandResult Handle(PropertySaveRequest request) 
    { 
     request.Property.OwnerId.ValidateArgumentRange(); 

     using (var client =_manager.GetClient()) 
     { 
      var propertyClient = client.As<Model.Property>(); 

      var propertyKey = string.Format("property:{0}", request.Property.OwnerId); 

      propertyClient.SetEntry(propertyKey, request.Property); 

      client.AddItemToSet("property", request.Property.OwnerId.ToString()); 
     } 

     return new PropertyCommandResult() {Success = true}; 
    } 
} 

Что я называю от службы, как так

public class PropertyService : Service, IPropertyService 
{ 
    private readonly ICommandHandlerFor<PropertySaveRequest, PropertyCommandResult> _commandHandler; 

    public PropertyService(ICommandHandlerFor<PropertySaveRequest, PropertyCommandResult> commandHandler) 
    { 
     this._commandHandler = commandHandler; 
    } 

    public object Post(PropertySaveRequest request) 
    { 
     if (request.Property == null) 
      throw new HttpError(HttpStatusCode.BadRequest, "Property cannot be null"); 

     var command = _commandHandler.Handle(request); 
     return command; 
    } 
} 

до сих пор это был подход - не уверен, что на правильном пути

[Test] 
    public void TestMethod1() 
    { 
     //arrange 
     _container = new WindsorContainer() 
       .Install(new PropertyInstaller()); 

     var mock = new Mock<IRedisClientsManager>(); 
     var instance = new Mock<RedisClient>(); 
     mock.Setup(t => t.GetClient()).Returns(instance); 
     // cannot resolve method error on instance 
     // stuck ... 
     var service = _container.Resolve<IPropertyService>(mock); 
    } 
+0

Что вы попробовали? Это сработало? Почему нет? Каковы были ваши мысли? –

+0

Отредактированное сообщение - должно быть хорошо, если я могу выяснить, как правильно исправить метод GetClient(). – MikeW

+0

Изобразительное. Можете ли вы попробовать 'mock.Setup (t => t.As (). GetClient()). Возвращает (экземпляр);'? –

ответ

2

Короче , так как RedisClient реализует IRedisClient, вы пытались создать макет с использованием интерфейса?

var instance = new Mock<IRedisClient>(); 

Почему вы используете настоящий контейнер для вашего модульного теста? Вы должны использовать auto-mocking container или просто (так как вы уже заботиться о издеваться вручную) создать реальный экземпляр тестовой мишени поставляя издевается, как зависимости

var target= new PropertyCommandHandler(mock); 

BTW ИМХ «команда обработчик», который возвращает значение звучит как запах ...

Смежные вопросы