2016-04-12 45 views
0

我正在使用testify測試XML編組並使用strings.Contains來檢查我希望包含在XML中的線是否實際存在。爲xml /字符串失敗測試定製輸出驗證

但是,我想區分實際與期望的xml。

目前,我的代碼看起來是這樣的:

func (suite *BookSuite) TestXMLMarshal() { 
    priceXML, priceErr := xml.Marshal(PriceType{Price: 10, Type: "IND"}) 

    suite.Nil(priceErr) 
    linePresent := strings.Contains(string(priceXML), `<PriceType Price="10" Type="IND"></PriceType>`) 

    if true != linePresent { 
     err := errors.New("Expected: \n" + `<PriceType Price="10" Type="IND"></PriceType>` + "\nGot: \n" + bookString) 
     suite.Error(err, err.Error()) 
     fmt.Println(err) 
    } 
} 

有比單一的一個測試XML文件更多的線,所以你可以想像,如果聲明將是毛。任何想法清理這個更具擴展性?

回答

1

除非格式化事項一大堆,快速徹底的方法來測試像xml.Marshal是元帥,並從和比較的對象

func (suite *BookSuite) TestXMLMarshal() { 

    priceXML, priceErr := xml.Marshal(PriceType{Price: 10, Type: "IND"}) 

    suite.Nil(priceErr) 

    var secondPrice PriceType 
    unerr := xml.Unmarshal(priceXML, &secondPrice) 
    suite.Nil(unerr) 

    if !reflect.DeepEqual(&priceXML,&secondPrice){ 
     err := fmt.Errorf("Expected: '%+v'\nGot: %+v\n",priceXML,secondPrice) 
     suite.Error(err, err.Error()) 
     fmt.Println(err) 
    } 
} 

未經測試,但應該是類似的東西。

+0

謝謝馬特。但我們確實想測試XML的實際格式,因爲它正在被指定xml格式的第三方使用(我們必須跳過一些循環)。任何想法如何納入? – daino3

+0

除非存在一些奇怪的空白要求,否則我會執行上述操作,然後在xml輸出上執行xml相對清晰度/規範化。大多數xml消費應用程序不關心空白(因爲xml庫文件級邏輯通常會處理這些)。如果你需要更多的控制編碼/ xml有Encoder.Indent來控制輸出的空白。 –