创建一个包装类,用于使用IDisposable的模拟

时间:2012-09-10 21:12:05

标签: c# wrapper

我有第三方组件,我正在尝试编写单元测试。问题是我无法模拟对象,也没有界面。

我决定创建一个接口和一个包装类,为了模拟而调用代码。我查看了Visual Studio使用元数据生成的类定义,并注意到了一些事项:

  • 该类有两个构造函数(一个接受参数)
  • 该类继承自IDisposable

我的问题是:

  1. 下面的实施方式是否合适?
  2. 我是否在代理类中正确处理了IDisposable实现?
  3. 我是否需要代理类中的第二个构造函数,因为接口不支持构造函数定义?我在我的代码中使用依赖注入,我假设除非我告诉我的DI框架使用第二个构造函数我不需要它,但我不确定。
  4. 元数据看起来像(精简版):

    public class PopClient : IDisposable
    {
        public const int DefaultPort = 110;
        public const int DefaultSSLPort = 995;
    
        public PopClient();
        public PopClient(AddressFamily addressFamily);
        public bool HasTimeStamp { get; }
        public List<string> Capability();
        public void Connect(string host);
        protected override void GetServerGreeting();
    }
    

    根据元数据,我的界面看起来像(在删除在接口定义中无效的方法/属性/访问修饰符之后):

    public interface IPopClient : IDisposable
    {
        bool HasTimeStamp { get; }
        List<string> Capability();
        void Connect(string host);
        void ConnectSSL(string host);
    }
    

    基于接口,我创建了包装类:

    public class PopClientProxy : IPopClient
    {
        private readonly Pop3 pop3;
    
        public PopClientProxy()
            this.pop3 = new Pop3();
    
        public PopClientProxy(AddressFamily addressFamily)
            this.pop3 = new Pop3(addressFamily);
    
        public bool HasTimeStamp
            get { return pop3.HasTimeStamp; }
    
        public List<string> Capability()
            return pop3.Capability();
    
        public void Connect(string host)
            pop3.Connect(host);
    
        public void Dispose()
        {
            if (pop3 != null)
                pop3.Dispose();
        }
    }
    

1 个答案:

答案 0 :(得分:0)

你的代理看起来很好。基于此,模拟测试所处理的接口的相关部分应该非常容易。

关于IDisposable实施,请查看disposable pattern common practicesThis question是关于它的。

对于构造函数,我会说它们根本不是接口的一部分,因此,不需要在代理的实现中进行复制。如果这导致DI容器中出现奇怪的构造函数逻辑,请尝试将构造从初始化中分离出来并将后者包含在接口中。