Каков наилучший метод тестирования сериализации?
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;
}
}
}
в приведенном выше коде я хотел бы заглушить / высмеять сериализатор.Serialize метод, чтобы убедиться, что вызывается метод. Я пробовал так много способов с moq и NMock, но потерпел неудачу.
пожалуйста, помогите мне в заглушке / издевательстве над вызовами сериализатора.
1 ответов
если вы не используете изолятор Typemock или родинки, вы не можете заменить ничего, что внутренне создано с new
ключевое слово.
вам нужно сначала извлечь интерфейс из XmlSerializer, а затем ввести его в класс.
в качестве примера, вы можете ввести этот интерфейс:
public interface IXmlSerializer
{
public void Serialize(Stream stream, object o);
}
введите это в свой класс Mailer следующим образом:
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;
}
}
теперь вы можете ввести макет в класс:
var mock = new Mock<IXmlSerializer>();
var sut = new ClientConfiguration(mock.Object);
в выше пример использует Moq.