2011-04-23 115 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; 
     } 
    } 
} 

在上面的代码中,我想存根/模拟serializer.Serialize方法来确保调用该方法。我用moq和NMock尝试了很多方法,但都失败了。什么是测试序列化的最佳方法?

请帮我在存根/嘲笑串行器的调用。

回答

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。

+0

SRP的美丽实施! – Morten 2011-04-27 10:44:20

+0

没有什么能像Google一样通过XmlSerializer界面来搜索Google,然后看到自己敲一个人是多么简单!谢谢! – daddywoodland 2012-03-07 15:13:01

+0

如何将StreamWriter类型的对象传递给期望类型为Stream的对象的Serialize方法?不是它应该是writer.BaseStream吗? – Dawid 2017-02-17 08:51:59

相关问题