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