2011-04-23 113 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

相關問題