2016-04-12 13 views
0

testifyでXMLマーシャリングをテストし、strings.Containsを使用してXMLに含まれると予想される行が実際に存在するかどうかを確認します。xml/stringsのテストに失敗した場合のカスタム出力の出力

しかし、実際の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) 
    } 
} 

あなたはif文は総額であることを行っていることを想像できるように、より多くの行が、テスト中に単一のものよりも、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 prettyprint/canonicalizationを行います。ほとんどのXMLを消費するアプリケーションは、空白を気にしません(なぜなら、xmlのlibaryレベルロジックがそれを処理するからです)。より多くの制御エンコーディングが必要な場合、xmlには出力される空白を制御するEncoder.Indentがあります。 –

関連する問題