0

總結用於Web服務(服務參考)單元測試 - XML序列化

我需要一種方法來反序列化的XML字符串轉換通常由第三方web服務返回的對象。

使用C#。

詳細

我有消耗第三方服務引用(Web服務)的代碼 - 這樣平常的東西:我們傳遞一個Request對象,並返回一個Response對象。

關於單元測試 - 我對服務引用的內部工作不感興趣,因爲這是第三方服務。我只對兩件事感興趣:

  1. 我的代碼是否生成正確的Request對象?
  2. 當服務引用返回它的響應時,是否正確處理此響應?

以每個依次爲:

請問我的代碼生成正確的Request對象?

這個我可以做。如果有人對此感興趣,我所做的就是用RhinoMocks Mock對象替換我的服務參考。在我的單元測試中,我調用我的Mock上的方法,然後檢查傳入的參數,將實際的Request對象與預期的Request對象進行比較。

當服務引用返回它的響應時,是否正確處理此響應?

我想在這裏做的是創建一個我的服務引用的RhinoMocks存根,以便當它被稱爲此存根時返回一個響應對象,填充我的測試數據。

我面對的問題是由這個特定的第三方服務返回的響應對象是非常複雜的。如果我試圖通過手工編寫所有屬性值來創建一個屬性值,那麼這可能會使我成爲一整天中最好的部分。

但是,我可以非常輕鬆地做的就是捕獲來自此服務的XML序列化響應。然後,我可以輕鬆地編輯它的值並將這個XML存儲在我的一個單元測試中。

我所追求的是一種簡單的方法,然後將此「測試」XML「反序列化」爲一個響應對象,並使用它來編寫我的存根響應。

任何幫助將不勝感激。

感謝

格里夫

回答

0

原來,這是一個相當簡單:

public static object Deserialize(string xml, Type toType) 
{ 
    using(Stream stream = new MemoryStream()) 
    { 
     byte[] data = System.Text.Encoding.UTF8.GetBytes(xml); 
     stream.Write(data, 0, data.Length); 
     stream.Position = 0; 
     var s = new XmlSerializer(toType, "http://^your url^"); 
     return s.Deserialize(stream); 
    } 
} 

請注意,如果你使用XML從SOAP請求,剝去包裹SOAP關閉第一。

格里夫

+0

你能接受你的答案嗎? –

+0

道歉 - 現在完成。 – DrGriff