12

.NET 2.0を使用していますが、最近のコード変更により、以前のAssert.AreEqual呼び出し(XMLの2つの文字列を比較)が無効になりました。新しいコードベースでは、XMLの1つの要素だけが実際に異なっているので、他のすべての要素を比較すると、希望する結果が得られることを願っています。比較は単体テストの一部であるため、プログラムで行う必要があります。

最初は、XmlDocumentのいくつかのインスタンスを使用することを検討していました。しかし、私はこれを見つけました:http: //drowningintechnicaldebt.com/blogs/scottroycraft/archive/2007/05/06/comparing-xml-files.aspx

うまくいくように見えますが、もっと良い方法がある場合に備えて、StackOverflowのフィードバックに興味がありました。

可能であれば、これに別の依存関係を追加することは避けたいと思います。

同様の質問

4

7 に答える 7

11

それは、「違い」として何を確認したいかによって異なります。

現在、Microsoft XmlDiff を使用しています: http://msdn.microsoft.com/en-us/library/aa302294.aspx

于 2008-11-18T17:56:24.533 に答える
4

XML を XmlDocument に解析し、XPath クエリに基づいて Assert 呼び出しを行う方が脆弱ではないことに気付くかもしれません。ここでは、私が頻繁に使用するヘルパー アサーション メソッドをいくつか紹介します。これは、XmlDocument またはドキュメントから取得した任意のノードで CreateNavigator() を呼び出すことによって取得できます。使用例は次のとおりです。

     XmlDocument doc = new XmlDocument( "Testdoc.xml" );
     XPathNavigator nav = doc.CreateNavigator();
     AssertNodeValue( nav, "/root/foo", "foo_val" );
     AssertNodeCount( nav, "/root/bar", 6 )

    private static void AssertNodeValue(XPathNavigator nav,
                                         string xpath, string expected_val)
    {
        XPathNavigator node = nav.SelectSingleNode(xpath, nav);
        Assert.IsNotNull(node, "Node '{0}' not found", xpath);
        Assert.AreEqual( expected_val, node.Value );
    }

    private static void AssertNodeExists(XPathNavigator nav,
                                         string xpath)
    {
        XPathNavigator node = nav.SelectSingleNode(xpath, nav);
        Assert.IsNotNull(node, "Node '{0}' not found", xpath);
    }

    private static void AssertNodeDoesNotExist(XPathNavigator nav,
                                         string xpath)
    {
        XPathNavigator node = nav.SelectSingleNode(xpath, nav);
        Assert.IsNull(node, "Node '{0}' found when it should not exist", xpath);
    }

    private static void AssertNodeCount(XPathNavigator nav, string xpath, int count)
    {
        XPathNodeIterator nodes = nav.Select( xpath, nav );
        Assert.That( nodes.Count, Is.EqualTo( count ) );
    }
于 2008-11-18T18:46:35.850 に答える
1

文字列に対して単純な文字列比較を行うと、xml常に機能するとは限りません。なんで ?

たとえば、両方:

<MyElement></MyElmennt>と観点<MyElment/>からは等しいxml..

xml常に同じに見えるように変換するためのアルゴリズムがあり、正規化アルゴリズムと呼ばれます。.Net正規化をサポートしています。

于 2008-11-18T18:08:12.667 に答える
1

シリアル化のためのアサートを含む小さなライブラリsourceを作成しました。

サンプル:

[Test]
public void Foo()
{
   ...
   XmlAssert.Equal(expected, actual, XmlAssertOptions.IgnoreDeclaration | XmlAssertOptions.IgnoreNamespaces);
}

NuGet

于 2016-04-29T06:45:35.220 に答える
0

XMLファイルの内容は異なるフォーマットを持つ可能性があり、同等性をテストするときに(DOMの観点から)同じと見なされる可能性があるため、その同等性の尺度を決定する必要があります。たとえば、フォーマットは無視されますか?メタデータは無視されますかなど、重要な位置付けであり、多くのエッジケースがあります。

通常、同等性ルールを定義するクラスを作成し、それを比較に使用します。比較クラスがIEqualityComparer and/or IEqualityComparer<T>インターフェイスを実装している場合、そのクラスは、同等性テストの実装として、多数の組み込みフレームワークリストで使用できます。さらに、もちろん、要件に応じて、必要な数の平等を異なる方法で測定することもできます。

すなわち

IEnumerable<T>.Contains
IEnumerable<T>.Equals
The constructior of a Dictionary etc etc
于 2008-11-18T21:43:56.133 に答える
0

次のコードで、必要な結果が得られました。

private static void ValidateResult(string validationXml, XPathNodeIterator iterator, params string[] excludedElements)
    {
        while (iterator.MoveNext())
        {
            if (!((IList<string>)excludedElements).Contains(iterator.Current.Name))
            {
                Assert.IsTrue(validationXml.Contains(iterator.Current.Value), "{0} is not the right value for {1}.", iterator.Current.Value, iterator.Current.Name);
            }
        }
    }

メソッドを呼び出す前に、次の方法で XmlDocument のインスタンスにナビゲーターを作成します。

XPathNavigator nav = xdoc.CreateNavigator();

次に、次のように XPathExpression のインスタンスを作成します。

XPathExpression expression = XPathExpression.Compile("/blah/*");

次の式で反復子を作成した後、メソッドを呼び出します。

XPathNodeIterator iterator = nav.Select(expression);

私はまだそれをさらに最適化する方法を考え出していますが、今のところうまくいきます.

于 2008-11-19T23:08:44.853 に答える