2009-05-19 65 views
0

爲了獲得良好的測試覆蓋率,我想測試WriteExternalReadExternal方法IPortableObject(如Creating an IPortableObject Implementation (.NET)所述)。在.NET中測試Oracle Coherence IPortableObject實現

這裏是類似於我在我的測試方法(我喜歡,它的工作原理)的代碼。

但得到這個工作,我不得不做的子類PofStreamWriter覆蓋BeginPropertyPofStreamReader覆蓋AdvanceTo。對我來說這聽起來有點有趣,但我無法想出更好的解決方案。以下是我的CoherenceTestHelper的實際代碼。

問題:有沒有其他人的單位測試他們的IPortableObject執行一個更好的方法?

public static class CoherenceTestHelper 
{ 
    public static T CopyUsingPofSerialization<T>(T ipoIn) where T : IPortableObject, new() 
    { 
     T ipoOut = new T(); 

     IPofContext context = new SimplePofContext(); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
     IPofWriter writer = new MyPofStreamWriter(new DataWriter(ms), context); 
     ipoIn.WriteExternal(writer); 

     ms.Seek(0, 0); 
     IPofReader reader = new MyPofStreamReader(new DataReader(ms), context); 
     ipoOut.ReadExternal(reader); 
     } 

     return ipoOut; 
    } 

    private class MyPofStreamWriter : PofStreamWriter 
    { 
     public MyPofStreamWriter(DataWriter writer, IPofContext context) 
     : base(writer, context) 
     { 
     } 

     protected override void BeginProperty(int index) 
     { 
     } 
    } 

    private class MyPofStreamReader : PofStreamReader 
    { 
     public MyPofStreamReader(DataReader reader, IPofContext context) 
     : base(reader, context) 
     { 
     } 

     protected override bool AdvanceTo(int index) 
     { 
     return true; 
     } 
    } 
} 

回答

0

這個測試是太關心IPofReaderIPofWriter的實際執行。我建議你使用像Rhino Mocks這樣的框架來創建讀寫器的模擬。將你的POF方法傳遞給模擬的讀寫器。然後簡單地聲明讀/寫方法是用正確的參數調用的。

+0

然後,我會需要一個特定的模擬每個IPortableObject實現,其中這個幫助器可以用於任何對象。另外,我想確保調用(例如,ReadString和WriteString)是平衡的,並且以相同的順序,我不知道如何模擬。我對實際執行感到遺憾。 – 2009-05-27 22:33:47

0

我一直在調查如何單元測試IPofSerializer的,我希望它是類似於你的問題。我發現,爲了正確序列化和反序列化用戶類型,你必須調用PofStreamWriter.WriteObject和PofStreamReader.ReadObject。用戶類型也必須使用PofContext進行註冊才能正常工作。

其原因是PofStreamWriter類包含它在序列化用戶類型時指定的嵌套子類。這個子類寫入關於PofStreamReader然後用於正確反序列化類型的類型的附加數據。如果沒有這些附加數據,PofStreamReader無法確定它是什麼類型以及應該使用哪個序列化器。看起來它只是沒有設置爲允許完全隔離測試序列化器,因爲在序列化時PofStreamReader和PofStreamWriter在內部保持了很多狀態。

爲了測試IPofSerializers我做了以下

var context = new SimplePofContext() 
context.RegisterUserType(1001, typeof(SerializableType), new SerializatableTypeSerializer()) 

using (var ms = new MemoryStream()) 
{ 
    var writer = new PofStreamWriter(new DataWriter(ms), context); 
    writer.WriteObject(0, object); 

    ms.Seek(0,0); 

    var reader = new PofStreamReader(new DataReader(ms), context); 
    var ob = reader.ReadObject(0) 
} 

我懷疑,但沒有測試,對於IPortableObjects你沒有與上下文註冊任何序這個工作。