C# 创建用于使用IDisposable的模拟的包装器类

C# 创建用于使用IDisposable的模拟的包装器类,c#,wrapper,C#,Wrapper,我有一个第三方组件,我正试图围绕它编写单元测试。问题是我无法模拟对象,并且没有接口 为了模拟,我决定创建一个接口和一个调用代码的包装器类。我查看了VisualStudio使用元数据生成的类定义,并注意到以下几点: 该类有两个构造函数(一个接受一个参数) 该类继承自IDisposable 我的问题是: 下面的实现看起来正确吗 我是否在代理类中正确处理IDisposable实现 由于接口不支持构造函数定义,我是否需要代理类中的第二个构造函数?我在我的代码中使用依赖注入,我假设除非我告诉我的DI框

我有一个第三方组件,我正试图围绕它编写单元测试。问题是我无法模拟对象,并且没有接口

为了模拟,我决定创建一个接口和一个调用代码的包装器类。我查看了VisualStudio使用元数据生成的类定义,并注意到以下几点:

  • 该类有两个构造函数(一个接受一个参数)
  • 该类继承自IDisposable
我的问题是:

  • 下面的实现看起来正确吗
  • 我是否在代理类中正确处理IDisposable实现
  • 由于接口不支持构造函数定义,我是否需要代理类中的第二个构造函数?我在我的代码中使用依赖注入,我假设除非我告诉我的DI框架使用第二个构造函数,否则我真的不需要它,但我不确定
  • 元数据看起来像(精简版):

    公共类PopClient:IDisposable
    {
    public const int DefaultPort=110;
    public const int DefaultSSLPort=995;
    公共PopClient();
    公共PopClient(AddressFamily AddressFamily);
    公共图书馆{get;}
    公共列表功能();
    公共void连接(字符串主机);
    受保护的覆盖无效GetServerGreeting();
    }
    
    基于元数据,我的接口看起来像(在删除接口定义中无效的方法/属性/访问修饰符后):

    公共接口IPopClient:IDisposable
    {
    bool hastinmestamp{get;}
    列出能力();
    void-Connect(字符串主机);
    void ConnectSSL(字符串主机);
    }
    
    然后,我基于接口创建了包装器类:

    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();
        }
    }
    
    公共类PopClientProxy:IPopClient
    {
    私有只读Pop3 Pop3;
    公共PopClientProxy()
    this.pop3=新的pop3();
    公共PopClientProxy(AddressFamily AddressFamily)
    this.pop3=新的pop3(addressFamily);
    公共厕所
    获取{return pop3.hastinmestamp;}
    公共列表功能()
    返回pop3.Capability();
    公共void连接(字符串主机)
    连接(主机);
    公共空间处置()
    {
    如果(pop3!=null)
    pop3.Dispose();
    }
    }
    
    您的代理看起来不错。基于此,模拟测试所处理的接口的相关部分应该非常容易

    关于
    IDisposable
    实现,请查看。是的

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

    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();
        }
    }