4

名前空間を持つXMLスキーマを持つhttp://mynamespace。デフォルトの名前空間を持つ間違ったXMLドキュメントxmlns="http://mynamespace"が検証されると、期待どおりに例外がスローされます。誰かがnamespace(http://Wrongnamespace)を変更した場合、この間違ったXMLは検証に合格します。

これがスキーマ検証を伴う単体テストです。メソッドXSD_NotValid_2が正しく機能していません:

[TestClass]
public class XSDTest
{
    public System.Xml.XmlReaderSettings ReaderSettings
    {
        get
        {
            string sXSD = "<xsd:schema targetNamespace=\"http://mynamespace\" xmlns=\"http://mynamespace\""
                + " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" elementFormDefault=\"qualified\">"
            + "<xsd:element name=\"Root\">"
            + "<xsd:complexType>"
                + "<xsd:sequence>"
                    + "<xsd:element name=\"Child\" minOccurs=\"1\" maxOccurs=\"1\" />"
                + "</xsd:sequence>"
             + "</xsd:complexType>"
            + "</xsd:element>"
            + "</xsd:schema>";

            System.Xml.Schema.XmlSchema schema = System.Xml.Schema.XmlSchema.Read(new System.IO.StringReader(sXSD)
                        , new System.Xml.Schema.ValidationEventHandler(OnValidationFail));

            System.Xml.XmlReaderSettings readerSettings_Ret = new System.Xml.XmlReaderSettings();
            readerSettings_Ret.ValidationType = System.Xml.ValidationType.Schema;
            readerSettings_Ret.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(OnValidationFail);
            readerSettings_Ret.Schemas.Add(schema);

            return readerSettings_Ret;
        }
    }


    private void OnValidationFail(object s, System.Xml.Schema.ValidationEventArgs e)
    {
        throw new OperationCanceledException("Validation error: " + e.Message);
    }

    [TestMethod]
    public void XSD_Valid_Test()
    {
         // Valid elements and valid namespace
        String sXML_Valid = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
            + "<Root xmlns=\"http://mynamespace\"><Child /></Root>";
        System.Xml.XmlReader xmlReader_Valid = 
            System.Xml.XmlReader.Create(new System.IO.StringReader(sXML_Valid), this.ReaderSettings);
        while (xmlReader_Valid.Read()) { } // no fail expected
    }

    [TestMethod]
    [ExpectedException(typeof(OperationCanceledException))]
    public void XSD_NotValid_1()
    {
         // No valid elements, while valid namespace
        String sXML_NotValid_1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
            + "<BadRoot xmlns=\"http://mynamespace\"><Child /></BadRoot>";
        System.Xml.XmlReader xmlReader_NoValid_1 = 
            System.Xml.XmlReader.Create(new System.IO.StringReader(sXML_NotValid_1), this.ReaderSettings);
        while (xmlReader_NoValid_1.Read()) ;
    }

    [TestMethod]
    [ExpectedException(typeof(OperationCanceledException))]
    public void XSD_NotValid_2()
    {
        // No valid elements and no valid namespace
        String sXML_NotValid_2 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
            + "<Root xmlns=\"http://Wrongnamespace\"><NotValidChild /></Root>";
        System.Xml.XmlReader xmlReader_NoValid_2 = 
            System.Xml.XmlReader.Create(new System.IO.StringReader(sXML_NotValid_2), this.ReaderSettings);
        while (xmlReader_NoValid_2.Read()) ;
    }
}

それは正常な動作ですか?正しい名前空間ターゲティングを強制する方法は?Rootまた、XSDに追加の要素がある場合に、要素を強制的に要求する方法はありRoot2ますか?

4

1 に答える 1

3

スキーマ検証の警告を有効にすると、次のエラーが発生します。

要素'http:// Wrongnamespace:Root'のスキーマ情報が見つかりませんでした。

使用する

readerSettings_Ret.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings;

いくつかの小さなこと:

  1. 単体テストでも、文字列操作によってXMLを作成するべきではありません。「すべてのルール」を知っているので、常にXMLAPIを使用してXMLを作成します。
  2. 単体テストでも、IDisposableを実装するオブジェクトの作成をusingブロックに配置する必要があります。実際、特に単体テストでは、各テストが他のテストから独立している必要があるため、次のテストを開始する前に、1つのテストがクリーンアップされていることを確認する必要があります。
于 2012-08-13T13:54:43.993 に答える