Каков наилучший метод тестирования сериализации?

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.