簡體   English   中英

一個單元如何測試修改XML文檔?

[英]How does one unit test modifying an XML document?

我不知道如何開始為該方法創建單元測試:

public override void ModifyXmlDocument(Foo foo, string nodeToChange, string newValue)
{
    XmlDocument xmlDocument = new XmlDocument();
    xmlDocument.Load(foo.XmlPathAndFileName);
    XmlElement rootElement = xmlDocument.DocumentElement;
    // rest of method (to modify an XML doc) here
}

該方法只是在XML文檔中找到元素/節點,並使用用戶提供的值對其進行更新。 (該方法比此處顯示的要復雜。)

我很難過的部分是了解如何執行此方法,而不依賴於硬盤。 但是xmlDocument.Load()采用文件路徑並從磁盤加載文件。 方法結束時,它將更新的文件保存回磁盤。

如何使該方法單元可測試?

有兩種方法可以執行此操作,但是所有方法都需要重構代碼。 ModifyXmlDocument將需要將XmlDocument作為參數,然后可以從那里對其進行模擬。

public void test_that_xml_is_loaded()
{
    var sut = new SUT();
    var xmldocumentfake = new Mock<XmlDocument>(){CallBase=true};
    xmldocumentfake.Setup(x=>x.LoadXml(It.IsAny<String>()));

    sut.ModifyXmlDocument(foo, nodeToChange, newValue, xmlDocumentfake.Object);

   xmldocumentfake.Verify(x=>x.LoadXml(It.IsAny<String>()), Times.Once());
}

您也可以將XmlDocument包裝在另一個類中,該類可以編寫為可以修改的抽象。 同樣,您必須將其傳遞。

同樣,正如安東尼·佩格拉姆(Anthony Pegram)所說的和我的意思:請注意不要違反單一責任原則 當測試太難編寫時,通常是您違反了該原則的尖叫。

有兩個選擇:

  • 如果您使用的是VS2012 Ultimate,則可以使用Fakes創建一個填充文件,該填充文件將在XmlDocument打開文件時覆蓋其行為。
  • 在測試時,請在單元測試中部署示例XML文件。 然后,當傳入Foo實例時,請使用該文件的路徑。
  • 嘗試使用XmlDocument.Load的替代項之一,例如采用流或XmlReader的替代項。 然后使用可以覆蓋的方法來創建它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM