Какой лучший способ проверить сериализацию? - PullRequest
6 голосов
/ 23 апреля 2011
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;
        }
    }
}

В приведенном выше коде я хотел бы заглушить / смоделировать метод serializer.Serialize, чтобы убедиться, что метод вызывается.Я пробовал так много способов с moq и NMock, но не смог.

Пожалуйста, помогите мне заглушить / насмешливые вызовы к сериализатору.

1 Ответ

8 голосов
/ 23 апреля 2011

Если вы не используете Typemock Isolator или Moles, вы не можете заменить что-либо внутренне созданное ключевым словом 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.

...