2011-04-23 15 views
6
using System; 
using System.Xml.Serialization; 
using System.IO; 

namespace Mailer { 
    public class ClientConfiguration { 

     public virtual bool Save(string fileName) { 
      XmlSerializer serializer = new XmlSerializer(typeof(ClientConfiguration)); 
      using (StreamWriter writer = new StreamWriter(fileName)) { 
       serializer.Serialize(writer, this); 
      } 
      return true; 
     } 
    } 
} 

En el código anterior, me gustaría rescindir/simular el método del serializador.Serializar para garantizar que se llame al método. Lo he intentado de tantas maneras con moq y NMock pero he fallado.¿Cuál es el mejor método para probar la serialización?

Por favor, ayúdenme en las llamadas al serializador.

Respuesta

8

A menos que use Typemock Isolator o Moles, no puede reemplazar nada que se haya creado internamente con la palabra clave new.

Primero tendrá que extraer una interfaz del XmlSerializer y luego insertar eso en la clase.

A modo de ejemplo, se puede introducir esta interfaz:

public interface IXmlSerializer 
{ 
    public void Serialize(Stream stream, object o); 
} 

Inyectar que en su clase Mailer así:

public class ClientConfiguration 
{ 
    private readonly IXmlSerializer serializer; 

    public ClientConfiguration(IXmlSerializer serializer) 
    { 
     if (serializer == null) 
     { 
      throw new ArgumentNullException("serializer"); 
     } 
     this.serializer = serializer; 
    } 

    public virtual bool Save(string fileName) 
    { 
     using (StreamWriter writer = new StreamWriter(fileName)) 
     { 
      this.serializer.Serialize(writer, this); 
     } 
     return true; 
    } 
} 

ya se puede inyectar el simulacro en la clase:

var mock = new Mock<IXmlSerializer>(); 
var sut = new ClientConfiguration(mock.Object); 

El ejemplo anterior usa Moq.

+0

¡Hermosa implementación de SRP! – Morten

+0

¡No hay nada como pescar en Google una interfaz XmlSerializer y luego ver cuán simple es derribar uno usted mismo! ¡Gracias! – daddywoodland

+0

¿Cómo pasaste el objeto de tipo StreamWriter al método Serialize que espera un objeto de tipo Stream? ¿No debería ser el escritor.BaseStream en su lugar? – Dawid

Cuestiones relacionadas