首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试ServiceController类

测试ServiceController类
EN

Code Review用户
提问于 2012-05-28 15:25:44
回答 2查看 1.9K关注 0票数 1

我正在开发一个小型桌面应用程序,它控制服务器上的服务。对于控制服务,我使用ServiceController类。我想做的是:测试我的代码,并从我的代码中抽象出ServiceController类。所以我做了下面这样的事。

代码语言:javascript
复制
  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的类中使用这个类。执行是;

代码语言:javascript
复制
   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,我可以安排这些代码通过测试,或者如何测试这些类?

代码语言:javascript
复制
      [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库进行测试。

EN

回答 2

Code Review用户

回答已采纳

发布于 2012-05-30 08:41:25

您必须执行类似的操作(这将适用于Moq,更改api使用以匹配您的模拟框架)。

代码语言:javascript
复制
_controller.Setup(p=>p.ServerNameOrIP).Returns("testServerName");

在调用assert语句之前。

票数 1
EN

Code Review用户

发布于 2012-05-29 18:23:00

如果您的模拟框架类似于我使用的框架,那么您可能需要在注入的ServerNameOrIP模拟上存根IServiceControllerWrapper。对于尚未存根的对象,模拟对象返回默认值(T)的情况并不少见。

顺便提一下,我建议修改您的IServiceControllerWrapper以消除Controller属性。包装器的目的只是公开代码从ServiceController中需要的那些方法/属性,同时隐藏使用ServiceController对象执行这些方法/属性的事实。如果其他人对您的包装器进行编码并使用此属性,那么他们就有效地将代码重新耦合到ServiceController中。

票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/12126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档