我有第三方组件,我正在尝试编写单元测试。问题是我无法模拟对象,也没有界面。
我决定创建一个接口和一个包装类,为了模拟而调用代码。我查看了Visual Studio使用元数据生成的类定义,并注意到了一些事项:
我的问题是:
元数据看起来像(精简版):
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();
}
}
答案 0 :(得分:0)
你的代理看起来很好。基于此,模拟测试所处理的接口的相关部分应该非常容易。
关于IDisposable
实施,请查看disposable pattern common practices。 This question是关于它的。
对于构造函数,我会说它们根本不是接口的一部分,因此,不需要在代理的实现中进行复制。如果这导致DI容器中出现奇怪的构造函数逻辑,请尝试将构造从初始化中分离出来并将后者包含在接口中。