Creando una clase de contenedor para usar para simular que usa IDisposable

Tengo un componente de terceros en el que estoy tratando de escribir pruebas unitarias. El problema es que no puedo burlarme del objeto y no hay interfaz.

Decidí crear una interfaz y una clase contenedora llamando al código para burlarme. Examiné la definición de clase que genera Visual Studio usando los metadatos y noté algunas cosas:

  • La clase tiene dos constructores (uno toma un parámetro)
  • La clase hereda de IDisposable

Mis preguntas son las siguientes:

  1. ¿Mi implementación a continuación se ve bien?
  2. ¿Manejé la implementación de IDisposable correctamente en la clase de proxy?
  3. ¿Necesito el segundo constructor en la clase de proxy ya que la interfaz no admite definiciones de constructor? Uso la inyección de dependencia en mi código y asumo que, a menos que le diga a mi marco DI que use el segundo constructor, realmente no lo necesito, pero no estoy seguro.

Los metadatos se ven como (versión reducida):

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

Según los metadatos, mi interfaz se ve así (después de eliminar métodos/propiedades/modificadores de acceso que no son válidos en una definición de interfaz):

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

Basado en la interfaz, luego creé la clase contenedora:

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

preguntado el 10 de septiembre de 12 a las 22:09

1 Respuestas

Tu proxy se ve bien. Basado en esto, debería ser muy fácil simular las partes relevantes de la interfaz con las que están tratando sus pruebas.

Acerca de IDisposable implementación, eche un vistazo a la prácticas comunes de patrón desechable. Esta pregunta es sobre eso.

Y para los constructores, diría que simplemente no son parte de la interfaz y, como tales, no necesitan replicarse en las implementaciones del proxy. Si eso conduce a una lógica de construcción extraña en su contenedor DI, intente separar la construcción de la inicialización e incluya esta última en la interfaz.

contestado el 23 de mayo de 17 a las 12:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.