如何使用最小起订量对服务栈 Redis 客户端进行单元测试
How to unit test Service Stacks Redis Client with Moq
我试图了解如何模拟 IRedisClientsManager,以便我可以使用 Moq 对下面的 Handle 方法进行单元测试。
干杯
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);
}
简而言之,由于 RedisClient 实现了 IRedisClient,您是否尝试使用接口创建模拟?
var instance = new Mock<IRedisClient>();
为什么要使用真正的容器进行单元测试?
您应该使用 auto-mocking container 或简单地(因为您已经手动处理模拟)创建测试目标的真实实例,提供模拟作为依赖项
var target= new PropertyCommandHandler(mock);
顺便说一句,恕我直言 "command handler" returns 一个值听起来像一股气味...
我试图了解如何模拟 IRedisClientsManager,以便我可以使用 Moq 对下面的 Handle 方法进行单元测试。
干杯
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);
}
简而言之,由于 RedisClient 实现了 IRedisClient,您是否尝试使用接口创建模拟?
var instance = new Mock<IRedisClient>();
为什么要使用真正的容器进行单元测试? 您应该使用 auto-mocking container 或简单地(因为您已经手动处理模拟)创建测试目标的真实实例,提供模拟作为依赖项
var target= new PropertyCommandHandler(mock);
顺便说一句,恕我直言 "command handler" returns 一个值听起来像一股气味...