1

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

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

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

我的问题是:

  1. 我下面的实现看起来正确吗?
  2. 我是否在代理类中正确处理了 IDisposable 实现?
  3. 由于接口不支持构造函数定义,我是否需要代理类中的第二个构造函数?我在我的代码中使用依赖注入,我假设除非我告诉我的 DI 框架使用第二个构造函数,否则我并不真的需要它,但我不确定。

元数据看起来像(精简版):

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

1 回答 1

0

您的代理看起来不错。基于它,应该很容易模拟您的测试正在处理的接口的相关部分。

关于IDisposable实现,看一下一次性模式的常见做法这个问题是关于它的。

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

于 2012-09-10T21:34:07.060 回答