什么是测试序列化的最佳方法?

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

在上面的代码中,我想要对serializer.Serialize方法进行桩/mock操作,以确保该方法被调用。我已经尝试了很多使用moq和NMock的方法,但都失败了。
请帮助我对调用serializer的方法进行桩/mock操作。
1个回答

8

除非您使用Typemock Isolator或Moles,否则无法替换使用new关键字内部创建的任何内容。

您需要先从XmlSerializer中提取一个接口,然后将其注入到类中。

例如,您可以引入此接口:

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

像这样将其注入到您的邮件类中:

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。

SRP的实现非常优美! - Morten
没有什么比在谷歌上搜索XmlSerializer接口,然后看到自己如何轻松地打造一个更让人感激的事情了!谢谢! - daddywoodland
你为什么把类型为StreamWriter的对象传给需要类型为Stream的Serialize方法?难道不应该是 writer.BaseStream 吗? - Dawid
@havekar 你可能是对的。这可能是我随意回答而没有尝试编译它的答案之一... - Mark Seemann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接