我正在开发一个小型桌面应用程序,它控制服务器上的服务。对于控制服务,我使用ServiceController类。我想做的是:测试我的代码,并从我的代码中抽象出ServiceController类。所以我做了下面这样的事。
public interface IServiceControllerWrapper
{
string ServerNameOrIP { get; }
int Status { get; }
bool CanStop { get; }
void StartService();
}
public class ServiceControllerWrapper : IServiceControllerWrapper
{
ServiceController _controller;
const string ServiceName = "W3SVC";
public ServiceControllerWrapper(string serverNameOrIP)
{
_controller = new ServiceController(ServiceName, serverNameOrIP);
}
public string ServerNameOrIP { get { return _controller.MachineName; } }
public int Status
{
get
{
switch (_controller.Status)
{
case ServiceControllerStatus.ContinuePending:
case ServiceControllerStatus.PausePending:
case ServiceControllerStatus.Paused:
return 4;
case ServiceControllerStatus.StopPending:
case ServiceControllerStatus.Stopped:
return 0;
case ServiceControllerStatus.StartPending:
case ServiceControllerStatus.Running:
return 1;
default:
return -1;
}
}
}
public bool CanStop
{
get
{
return _controller.CanStop;
}
}
public void StartService()
{
_controller.Start();
}
//shortened
}我在另一个名为ServerContext的类中使用这个类。执行是;
public interface IServerContext
{
string ServerName { get; }
IServerContext Parent { get; }
IServiceControllerWrapper Controller { get; }
bool HasError { get; set; }
int GetServiceStatus();
}
public class ServerContext : IServerContext
{
IServerContext _parent;
IServiceControllerWrapper _controller;
public ServerContext(IServerContext parent, IServiceControllerWrapper wrapper)
{
_parent = parent;
_controller = wrapper;
}
public string ServerName { get { return _controller.ServerNameOrIP; }}
public IServerContext Parent
{
get
{
return _parent;
}
}
public IServiceControllerWrapper Controller
{
get
{
return _controller;
}
}
public bool HasError { get; set; }
public int GetServiceStatus()
{
return _controller.Status;
}
}我的问题是,我正在尝试测试ServerContext和ServiceControllerWrapper,但我无法创建假对象。这个测试方法总是抛出异常,因为ServerName是null.How,我可以安排这些代码通过测试,或者如何测试这些类?
[Fact]
public void ServerName_CannotBeEmpty()
{
Mock<IServiceControllerWrapper> _controller = new Mock<IServiceControllerWrapper>();
ServerContext serverContext = new ServerContext(null, _controller.Object);
//this code fails.
serverContext.ServerName.Should().Not.Be.NullOrEmpty();
}欢迎任何建议。注意:我正在使用moq、xunit和SharpTestsEx库进行测试。
发布于 2012-05-30 08:41:25
您必须执行类似的操作(这将适用于Moq,更改api使用以匹配您的模拟框架)。
_controller.Setup(p=>p.ServerNameOrIP).Returns("testServerName");在调用assert语句之前。
发布于 2012-05-29 18:23:00
如果您的模拟框架类似于我使用的框架,那么您可能需要在注入的ServerNameOrIP模拟上存根IServiceControllerWrapper。对于尚未存根的对象,模拟对象返回默认值(T)的情况并不少见。
顺便提一下,我建议修改您的IServiceControllerWrapper以消除Controller属性。包装器的目的只是公开代码从ServiceController中需要的那些方法/属性,同时隐藏使用ServiceController对象执行这些方法/属性的事实。如果其他人对您的包装器进行编码并使用此属性,那么他们就有效地将代码重新耦合到ServiceController中。
https://codereview.stackexchange.com/questions/12126
复制相似问题